Legacy/include/MultiSense/details/storage.hh
Go to the documentation of this file.
1 
37 #ifndef LibMultiSense_details_storage_hh
38 #define LibMultiSense_details_storage_hh
39 
41 
42 #include <map>
43 #include <deque>
44 
45 namespace crl {
46 namespace multisense {
47 namespace details {
48 
49  //
50  // A message storage interface
51  //
52  // Assumes a 1:1 relationship between template class and ID
53 
54  class MessageMap {
55  public:
56 
57  template<class T> void store(const T& msg) {
59 
60  Map::iterator it = m_map.find(MSG_ID(T::ID));
61  if (m_map.end() != it) {
62  it->second.destroy<T>();
63  m_map.erase(it);
64  }
65 
66  m_map[MSG_ID(T::ID)] = Holder::Create<T>(msg);
67  }
68 
69  template<class T> Status extract(T& msg) {
71 
72  Map::iterator it = m_map.find(MSG_ID(T::ID));
73  if (m_map.end() == it)
74  return Status_Error;
75 
76  it->second.extract(msg);
77  m_map.erase(it);
78 
79  return Status_Ok;
80  }
81 
82  private:
83 
84  class Holder {
85  public:
86 
87  Holder(void *r=NULL) : m_refP(r) {};
88 
89  template<class T> static Holder Create(const T& msg) {
90  return Holder(reinterpret_cast<void *>(new T(msg)));
91  }
92 
93  template<class T> void destroy() {
94  if (NULL == m_refP)
95  CRL_EXCEPTION("destroying NULL reference", "");
96  delete reinterpret_cast<T*>(m_refP);
97  }
98 
99  template<class T> void extract(T& msg) {
100  if (NULL == m_refP)
101  CRL_EXCEPTION("extracting NULL reference", "");
102  msg = *(reinterpret_cast<T*>(m_refP));
103  destroy<T>();
104  }
105 
106  private:
107  void *m_refP;
108  };
109 
110  typedef std::map<wire::IdType, Holder> Map;
111 
114  };
115 
116  //
117  // A constant-depth cache.
118  //
119  // Up to [depth] entries will be cached. Oldest entries
120  // will be dropped on insertion once full.
121  //
122  // The age of an entry is determined by std::map<KEY,DATA>.lower_bound([min]).
123  //
124  // DATA objects are assumed to be allocated on the heap, and memory management
125  // of the object is delegated here upon insert().
126  //
127  // For *_nolock() variations, lock-management must be
128  // done by the user.
129 
130  template<class KEY, class DATA>
131  class DepthCache {
132  public:
133 
134  DepthCache(std::size_t depth) :
135  m_depth(depth) {};
136 
139 
140  typename MapType::iterator it = m_map.begin();
141  for(; it != m_map.end();) {
142  delete it->second;
143  m_map.erase(it++);
144  }
145  };
146 
148  return m_lock;
149  };
150 
151  DATA* find_nolock(KEY key) {
152  return find_(key);
153  };
154 
155  DATA* find(KEY key) {
157  return find_(key);
158  };
159 
160  void insert_nolock(KEY key, DATA* data) {
161  insert_(key, data);
162  };
163 
164  void insert(KEY key, DATA* data) {
166  insert_(key, data);
167  };
168 
169  void remove_nolock(KEY key) {
170  remove_(key);
171  };
172 
173  void remove(KEY key) {
175  remove_(key);
176  };
177 
178  //
179  // Given that an insertion operation will happen, this function returns whether the
180  // depth cache will drop a key, and if so, what the key that will be dropped is.
181  //
182  std::pair<bool, KEY> will_drop() {
184  return will_drop_();
185  };
186 
187  private:
188 
189  typedef std::deque<KEY> QueueType;
190  typedef std::map<KEY,DATA*> MapType;
191 
192  DATA* find_(KEY key) {
193  typename MapType::iterator it = m_map.find(key);
194 
195  if (m_map.end() == it)
196  return NULL;
197  else
198  return it->second;
199  };
200 
201  void insert_(KEY key, DATA* data) {
202  if (m_map.size() == m_depth)
203  {
204  pop_oldest_();
205  }
206 
207  typename MapType::iterator it = m_map.find(key);
208  if (it == m_map.end()) {
209  m_queue.push_front(key);
210  m_map[key] = data;
211  }
212  else {
213  delete it->second;
214  it->second = data;
215  }
216 
217  };
218 
219  void remove_(KEY key) {
220  typename MapType::iterator it2 = m_map.find(key);
221  if (m_map.end() != it2) {
222  delete it2->second;
223  m_map.erase(it2);
224  }
225 
226  //assume we're erasing an older key, so search the order queue from the back
227  for (typename QueueType::reverse_iterator it = m_queue.rbegin(); it != m_queue.rend();) {
228  if (*it == key) {
229  m_queue.erase(--(it.base()));
230  break;
231  }
232  ++it;
233  }
234  };
235 
236  void pop_oldest_() {
237 
238  while (!m_queue.empty())
239  {
240  KEY k = m_queue.back();
241  typename MapType::iterator it2 = m_map.find(k);
242  if (m_map.end() != it2) {
243  delete it2->second;
244  m_map.erase(it2);
245  m_queue.pop_back();
246  break;
247  }
248  m_queue.pop_back();
249  }
250  };
251 
252  std::pair<bool, KEY> will_drop_() {
253  const bool will_drop = m_map.size() == m_depth;
254  KEY drop_key; // If will_drop is false, this value is intentionally uninitialized
255 
256  if (will_drop)
257  {
258  drop_key = m_queue.back();
259  }
260  return std::pair<bool, KEY>(will_drop, drop_key);
261  }
262 
263  const std::size_t m_depth;
267  };
268 
269 }}} // namespaces
270 
271 #endif // LibMultiSense_details_storage_hh
crl::multisense::details::DepthCache::insert
void insert(KEY key, DATA *data)
Definition: Legacy/include/MultiSense/details/storage.hh:164
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
crl::multisense::details::DepthCache::DepthCache
DepthCache(std::size_t depth)
Definition: Legacy/include/MultiSense/details/storage.hh:134
crl::multisense::details::DepthCache::insert_
void insert_(KEY key, DATA *data)
Definition: Legacy/include/MultiSense/details/storage.hh:201
crl::multisense::Status_Error
static CRL_CONSTEXPR Status Status_Error
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:101
crl::multisense::details::utility::Mutex
Definition: linux/Thread.hh:144
crl::multisense::details::MessageMap::Holder::extract
void extract(T &msg)
Definition: Legacy/include/MultiSense/details/storage.hh:99
crl::multisense::details::DepthCache::will_drop
std::pair< bool, KEY > will_drop()
Definition: Legacy/include/MultiSense/details/storage.hh:182
crl::multisense::details::MessageMap::Holder::Create
static Holder Create(const T &msg)
Definition: Legacy/include/MultiSense/details/storage.hh:89
crl::multisense::details::DepthCache::will_drop_
std::pair< bool, KEY > will_drop_()
Definition: Legacy/include/MultiSense/details/storage.hh:252
crl::multisense::details::DepthCache::QueueType
std::deque< KEY > QueueType
Definition: Legacy/include/MultiSense/details/storage.hh:185
crl::multisense::details::DepthCache::m_queue
QueueType m_queue
Definition: Legacy/include/MultiSense/details/storage.hh:265
crl::multisense::details::MessageMap::Holder::Holder
Holder(void *r=NULL)
Definition: Legacy/include/MultiSense/details/storage.hh:87
crl::multisense::details::MessageMap::m_map
Map m_map
Definition: Legacy/include/MultiSense/details/storage.hh:113
CRL_EXCEPTION
#define CRL_EXCEPTION(fmt,...)
Definition: Exception.hh:85
crl
Definition: Legacy/details/channel.cc:61
crl::multisense::details::DepthCache::remove
void remove(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:173
crl::multisense::details::DepthCache::find
DATA * find(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:155
crl::multisense::details::DepthCache::remove_
void remove_(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:219
crl::multisense::details::DepthCache::~DepthCache
~DepthCache()
Definition: Legacy/include/MultiSense/details/storage.hh:137
crl::multisense::details::DepthCache::mutex
utility::Mutex & mutex()
Definition: Legacy/include/MultiSense/details/storage.hh:147
crl::multisense::details::MessageMap::Holder::destroy
void destroy()
Definition: Legacy/include/MultiSense/details/storage.hh:93
MSG_ID
#define MSG_ID(x)
Definition: Protocol.hh:344
crl::multisense::details::DepthCache::pop_oldest_
void pop_oldest_()
Definition: Legacy/include/MultiSense/details/storage.hh:236
crl::multisense::details::DepthCache::remove_nolock
void remove_nolock(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:169
crl::multisense::details::MessageMap::extract
Status extract(T &msg)
Definition: Legacy/include/MultiSense/details/storage.hh:69
crl::multisense::details::MessageMap::Map
std::map< wire::IdType, Holder > Map
Definition: Legacy/include/MultiSense/details/storage.hh:110
crl::multisense::details::DepthCache::find_
DATA * find_(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:192
crl::multisense::details::DepthCache::MapType
std::map< KEY, DATA * > MapType
Definition: Legacy/include/MultiSense/details/storage.hh:190
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
crl::multisense::details::DepthCache::find_nolock
DATA * find_nolock(KEY key)
Definition: Legacy/include/MultiSense/details/storage.hh:151
crl::multisense::details::DepthCache::insert_nolock
void insert_nolock(KEY key, DATA *data)
Definition: Legacy/include/MultiSense/details/storage.hh:160
multisense
Definition: factory.cc:39
crl::multisense::details::utility::ScopedLock
Definition: linux/Thread.hh:165
Thread.hh
crl::multisense::details::MessageMap::Holder
Definition: Legacy/include/MultiSense/details/storage.hh:84
crl::multisense::details::DepthCache::m_depth
const std::size_t m_depth
Definition: Legacy/include/MultiSense/details/storage.hh:263
crl::multisense::details::DepthCache::m_map
MapType m_map
Definition: Legacy/include/MultiSense/details/storage.hh:264
crl::multisense::details::DepthCache
Definition: Legacy/include/MultiSense/details/storage.hh:131
crl::multisense::details::MessageMap::m_lock
utility::Mutex m_lock
Definition: Legacy/include/MultiSense/details/storage.hh:112
crl::multisense::details::MessageMap::Holder::m_refP
void * m_refP
Definition: Legacy/include/MultiSense/details/storage.hh:107
crl::multisense::details::MessageMap
Definition: Legacy/include/MultiSense/details/storage.hh:54
crl::multisense::details::MessageMap::store
void store(const T &msg)
Definition: Legacy/include/MultiSense/details/storage.hh:57
crl::multisense::details::DepthCache::m_lock
utility::Mutex m_lock
Definition: Legacy/include/MultiSense/details/storage.hh:266


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:09