libqi-api  2.4.3.28
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
maptypeinterface.hxx
Go to the documentation of this file.
1 #pragma once
2 /*
3 ** Copyright (C) 2013 Aldebaran Robotics
4 ** See COPYING for the license
5 */
6 
7 #ifndef _QITYPE_DETAILS_TYPEMAP_HXX_
8 #define _QITYPE_DETAILS_TYPEMAP_HXX_
9 
10 namespace qi
11 {
12  // List container
13 template<typename M> class MapTypeInterfaceImpl:
14 public MapTypeInterface
15 {
16 public:
17  typedef DefaultTypeImplMethods<M,
21  virtual TypeInterface* elementType();
22  virtual TypeInterface* keyType();
23  virtual size_t size(void* storage);
24  virtual AnyIterator begin(void* storage);
25  virtual AnyIterator end(void* storage);
26  virtual void insert(void** storage, void* keyStorage, void* valueStorage);
27  virtual AnyReference element(void** storage, void* keyStorage, bool autoInsert);
31 };
32 
33 }
34 
35 namespace qi {
36 template<typename M>
38 {
39  this->_keyType = typeOf<typename M::key_type>();
40  this->_elementType = typeOf<typename M::mapped_type>();
41 }
42 
43 
44 template<typename M> TypeInterface*
46 {
47  return _elementType;
48 }
49 
50 template<typename M> TypeInterface*
52 {
53  return _keyType;
54 }
55 
56 template<typename M> size_t
58 {
59  M* ptr = (M*)ptrFromStorage(&storage);
60  return ptr->size();
61 }
62 
63 
64 template<typename M> AnyIterator
66 {
67  M* ptr = (M*)ptrFromStorage(&storage);
69 }
70 
71 template<typename M> AnyIterator
73 {
74  M* ptr = (M*)ptrFromStorage(&storage);
76 }
77 
78 template<typename M> void
79 MapTypeInterfaceImpl<M>::insert(void** storage, void* keyStorage, void* valueStorage)
80 {
81  M* ptr = (M*) ptrFromStorage(storage);
82  typename M::key_type& key = *(typename M::key_type*)_keyType->ptrFromStorage(&keyStorage);
83  typename M::mapped_type& val = *(typename M::mapped_type*)_elementType->ptrFromStorage(&valueStorage);
84  typename M::iterator it = ptr->find(key);
85  if (it == ptr->end())
86  ptr->insert(std::make_pair(key, val));
87  else
88  it->second = val;
89 }
90 
91 template<typename M> AnyReference
92 MapTypeInterfaceImpl<M>::element(void** storage, void* keyStorage, bool autoInsert)
93 {
94  //static TypeInterface* elemType = typeOf<typename M::mapped_type>();
95  M* ptr = (M*) ptrFromStorage(storage);
96  typename M::key_type* key = (typename M::key_type*)_keyType->ptrFromStorage(&keyStorage);
97  typename M::iterator it = ptr->find(*key);
98  if (it == ptr->end())
99  {
100  if (!autoInsert)
101  return AnyReference();
102  typename M::mapped_type& e = (*ptr)[*key];
103  return AnyReference::from(e);
104  }
105  else
106  return AnyReference::from(((typename M::mapped_type&)(it->second)));
107 }
108 
109 
110 
111 template<typename K, typename V, typename C, typename A>
112 struct TypeImpl<std::map<K,V, C, A> >: public MapTypeInterfaceImpl<std::map<K, V,C,A> > {};
113 
114 }
115 #endif // _QITYPE_DETAILS_TYPEMAP_HXX_
static AnyIterator make(const T &val)
virtual void insert(void **storage, void *keyStorage, void *valueStorage)
Set a key to a value and creates it if it does not exist.
virtual AnyIterator begin(void *storage)
Return an iterator pointing to the first key-value pair of the map.
AnyReference find(const K &key)
virtual TypeInterface * keyType()
Get the types of the keys of the map.
virtual size_t size(void *storage)
Return the number of elements in the map.
_QI_BOUNCE_TYPE_METHODS(MethodsImpl)
static AnyReference from(const T &ref)
DefaultTypeImplMethods< M, TypeByPointerPOD< M > > MethodsImpl
virtual TypeInterface * elementType()
Get the types of the values of the map.
virtual AnyIterator end(void *storage)
virtual AnyReference element(void **storage, void *keyStorage, bool autoInsert)