VSM C++ SDK
Vehicle Specific Modules SDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
io_request.h
Go to the documentation of this file.
1 // Copyright (c) 2018, Smart Projects Holdings Ltd
2 // All rights reserved.
3 // See LICENSE file for license details.
4 
11 #ifndef _UGCS_VSM_IO_REQUEST_H_
12 #define _UGCS_VSM_IO_REQUEST_H_
13 
14 #include <ugcs/vsm/io_stream.h>
15 #include <ugcs/vsm/utils.h>
16 
17 namespace ugcs {
18 namespace vsm {
19 
21 class Io_request: public Request {
23 
24 public:
35  Io_result& result_arg):
36  stream(stream), offset(offset), result_arg(result_arg)
37  {}
38 
41  Get_stream() const
42  {
43  return stream;
44  }
45 
49  {
50  return offset;
51  }
52 
59  void
61  Io_result result,
62  const Request::Locker& lock = Request::Locker())
63  {
64  Request::Locker local_lock;
65  if (lock) {
66  ASSERT(Lock(false).mutex() == lock.mutex());
67  } else {
68  local_lock = Lock();
69  }
71  result_arg = result;
72  }
73  last_result = result;
74  }
75 
80  Io_result
82  {
83  return last_result;
84  }
85 
86 private:
88  Io_stream::Ptr stream;
89 
91  Io_stream::Offset offset;
92 
94  Io_result &result_arg;
95 
97  Io_result last_result = Io_result::OTHER_FAILURE;
98 
99  virtual void
100  Destroy() override
101  {
102  stream = nullptr;
103  }
104 };
105 
107 class Write_request : public Io_request
108 {
109 public:
111  typedef std::shared_ptr<Write_request> Ptr;
112 
117  template <typename... Args>
118  Write_request(Io_buffer::Ptr buffer, Args &&... args):
119  Io_request(std::forward<Args>(args)...), buffer(buffer)
120  {}
121 
123  template <typename... Args>
124  static Ptr
125  Create(Args &&... args)
126  {
127  return std::make_shared<Write_request>(std::forward<Args>(args)...);
128  }
129 
133  {
134  return buffer;
135  }
136 
137 private:
139  Io_buffer::Ptr buffer;
140 };
141 
143 class Read_request : public Io_request
144 {
145 public:
147  typedef std::shared_ptr<Read_request> Ptr;
148 
157  template <typename... Args>
158  Read_request(Io_buffer::Ptr& buffer_arg, size_t max_to_read, size_t min_to_read,
159  Args &&... args):
160  Io_request(std::forward<Args>(args)...),
161  buffer_arg(buffer_arg), max_to_read(max_to_read), min_to_read(min_to_read)
162  {}
163 
165  template <typename... Args>
166  static Ptr
167  Create(Args &&... args)
168  {
169  return std::make_shared<Read_request>(std::forward<Args>(args)...);
170  }
171 
178  void
180  Io_buffer::Ptr buffer,
181  const Request::Locker& lock = Request::Locker())
182  {
183  Request::Locker local_lock;
184  if (lock) {
185  ASSERT(Lock(false).mutex() == lock.mutex());
186  } else {
187  local_lock = Lock();
188  }
190  buffer_arg = buffer;
191  }
192  last_read_buffer = buffer;
193  }
194 
201  {
202  return last_read_buffer;
203  }
204 
206  size_t
208  {
209  return max_to_read;
210  }
211 
213  size_t
215  {
216  return min_to_read;
217  }
218 
219 private:
221  Io_buffer::Ptr &buffer_arg;
222 
224  Io_buffer::Ptr last_read_buffer;
225 
227  size_t max_to_read,
229  min_to_read;
230 };
231 
232 } /* namespace vsm */
233 } /* namespace ugcs */
234 
235 #endif /* _UGCS_VSM_IO_REQUEST_H_ */
void Set_buffer_arg(Io_buffer::Ptr buffer, const Request::Locker &lock=Request::Locker())
Sets the buffer argument.
Definition: io_request.h:179
Generic request for implementing inter-threads communications and asynchronous operations.
Definition: request_container.h:37
Io_stream::Ptr Get_stream() const
Locks and gets the associated stream.
Definition: io_request.h:41
static Ptr Create(Args &&...args)
Create an instance of the request.
Definition: io_request.h:125
int64_t Offset
Offset for read/write operations.
Definition: io_stream.h:75
Baser I/O write request.
Definition: io_request.h:107
Io_result Get_last_result()
Get the most recently set result value.
Definition: io_request.h:81
Abstract stream for I/O operations.
Write_request(Io_buffer::Ptr buffer, Args &&...args)
Construct write request.
Definition: io_request.h:118
size_t Get_max_to_read() const
Get maximal number of bytes to read.
Definition: io_request.h:207
Basic I/O read request.
Definition: io_request.h:143
bool Is_completion_handler_present()
Checks the availability of the completion handler.
Io_result
Result of I/O operation.
Definition: io_stream.h:37
#define ASSERT(x)
No action in release.
Definition: debug.h:68
Io_buffer::Ptr & Data_buffer()
Access the buffer with data to write.
Definition: io_request.h:132
Various common utilities.
Abstract I/O stream interface.
Definition: io_stream.h:66
std::shared_ptr< Io_request > Ptr
Pointer type.
Definition: io_request.h:22
Some other system failure.
size_t Get_min_to_read() const
Get minimal number of bytes to read.
Definition: io_request.h:214
Locker Lock(bool acquire=true) const
Acquire lock for request internal state.
Read_request(Io_buffer::Ptr &buffer_arg, size_t max_to_read, size_t min_to_read, Args &&...args)
Constructor.
Definition: io_request.h:158
Io_stream::Offset & Offset()
Get I/O operation offset value.
Definition: io_request.h:48
Base request for I/O operations.
Definition: io_request.h:21
std::shared_ptr< Read_request > Ptr
Shared pointer to read request.
Definition: io_request.h:147
void Set_result_arg(Io_result result, const Request::Locker &lock=Request::Locker())
Sets the result argument.
Definition: io_request.h:60
std::unique_lock< std::mutex > Locker
Smart lock object for request external locking.
Definition: request_container.h:88
std::shared_ptr< Write_request > Ptr
Shared pointer to write request.
Definition: io_request.h:111
std::shared_ptr< Io_buffer > Ptr
Pointer type.
Definition: io_buffer.h:34
#define DEFINE_COMMON_CLASS(__class_name,...)
Use this macro to define some common attributes for a class.
Definition: utils.h:25
std::shared_ptr< Io_stream > Ptr
Pointer type.
Definition: io_stream.h:67
Io_buffer::Ptr Get_last_read_buffer()
Get the most recently set read buffer.
Definition: io_request.h:200
static Ptr Create(Args &&...args)
Create an instance of read request.
Definition: io_request.h:167