libqi-api  2.4.3.28
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
listtypeinterface.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_TYPELIST_HXX_
8 #define _QITYPE_DETAILS_TYPELIST_HXX_
9 
10 #include <boost/static_assert.hpp>
11 
12 #include <qi/atomic.hpp>
13 
16 #include <qi/anyfunction.hpp>
17 
18 namespace qi
19 {
20  // List container
21 template<typename T, typename H = ListTypeInterface>
22 class ListTypeInterfaceImpl: public H
23 {
24 public:
27  virtual size_t size(void* storage);
28  virtual TypeInterface* elementType();
29  virtual AnyIterator begin(void* storage);
30  virtual AnyIterator end(void* storage);
31  virtual void pushBack(void** storage, void* valueStorage);
34 };
35 
36 // Type impl for any class that behaves as a forward iterator (++, *, ==)
37 template<typename T>
39 {
40 public:
41  typedef T Storage;
42  virtual AnyReference dereference(void* storage)
43  {
44  T* ptr = (T*)ptrFromStorage(&storage);
45  return AnyReference::from(*(*ptr));
46  }
47  virtual void next(void** storage)
48  {
49  T* ptr = (T*)ptrFromStorage(storage);
50  ++(*ptr);
51  }
52  virtual bool equals(void* s1, void* s2)
53  {
54  T* p1 = (T*)ptrFromStorage(&s1);
55  T* p2 = (T*)ptrFromStorage(&s2);
56  return *p1 == *p2;
57  }
60  static AnyIterator make(const T& val)
61  {
62  static TypeSimpleIteratorImpl<T>* type = 0;
63  QI_THREADSAFE_NEW(type);
64  return AnyValue(AnyReference(type, type->initializeStorage(const_cast<void*>((const void*)&val))));
65  }
66 };
67 
68 
69 template<typename T, typename H>
71 {
72  _elementType = typeOf<typename T::value_type>();
73 }
74 
75 template<typename T, typename H> TypeInterface*
77 {
78  return _elementType;
79 }
80 
81 template<typename T, typename H>
83 {
84  T* ptr = (T*)ptrFromStorage(&storage);
86 }
87 
88 template<typename T, typename H>
90 {
91  T* ptr = (T*)ptrFromStorage(&storage);
93 }
94 namespace detail
95 {
96  template<typename T, typename E>
97  void pushBack(T& container, E* element)
98  {
99  container.push_back(*element);
100  }
101  template<typename CE, typename E>
102  void pushBack(std::set<CE>& container, E* element)
103  {
104  container.insert(*element);
105  }
106 }
107 template<typename T, typename H>
108 void ListTypeInterfaceImpl<T, H>::pushBack(void **storage, void* valueStorage)
109 {
110  T* ptr = (T*) ptrFromStorage(storage);
111  detail::pushBack(*ptr, (typename T::value_type*)_elementType->ptrFromStorage(&valueStorage));
112 }
113 
114 template<typename T, typename H>
116 {
117  T* ptr = (T*) ptrFromStorage(&storage);
118  return ptr->size();
119 }
120 
121 // There is no way to register a template container type :(
122 template<typename T> struct TypeImpl<std::vector<T> >: public ListTypeInterfaceImpl<std::vector<T> >
123 {
124  BOOST_STATIC_ASSERT_MSG((!boost::is_same<T,bool>::value), "std::vector<bool> is not supported by AnyValue.");
125 };
126 template<typename T> struct TypeImpl<std::list<T> >: public ListTypeInterfaceImpl<std::list<T> > {};
127 template<typename T> struct TypeImpl<std::set<T> >: public ListTypeInterfaceImpl<std::set<T> > {};
128 
129 
130 // varargs container
131 template<typename T>
132 class VarArgsTypeInterfaceImpl: public ListTypeInterfaceImpl<typename T::VectorType, VarArgsTypeInterface>
133 {
134 public:
136 
139 
141 
142  void* adaptStorage(void** storage) {
143  T* ptr = (T*) ptrFromStorage(storage);
144  //return ptr
145  typename T::VectorType& v = ptr->args();
146  return &v;
147  }
148 
149  virtual size_t size(void* storage) {
150  return BaseClass::size(adaptStorage(&storage));
151  }
152  virtual AnyIterator begin(void* storage) {
153  return BaseClass::begin(adaptStorage(&storage));
154  }
155  virtual AnyIterator end(void* storage) {
156  return BaseClass::end(adaptStorage(&storage));
157  }
158  virtual void pushBack(void** storage, void* valueStorage) {
159  void* vstor = adaptStorage(storage);
160  BaseClass::pushBack(&vstor, valueStorage);
161  }
162 
163  //ListTypeInterface* _list;
164 };
165 
166 
167 template<typename T> struct TypeImpl<qi::VarArguments<T> >: public VarArgsTypeInterfaceImpl<qi::VarArguments<T> > {};
168 }
169 
170 #endif // _QITYPE_DETAILS_TYPELIST_HXX_
virtual void * ptrFromStorage(void **)=0
ListTypeInterfaceImpl< typename T::VectorType, VarArgsTypeInterface > BaseClass
static AnyIterator make(const T &val)
virtual size_t size(void *storage)
Return the number of elements in the list.
_QI_BOUNCE_TYPE_METHODS(MethodsImpl)
virtual AnyIterator end(void *storage)
void pushBack(T &container, E *element)
DefaultTypeImplMethods< T, TypeByPointerPOD< T > > MethodsImpl
DefaultTypeImplMethods< T, TypeByPointerPOD< T > > MethodsImpl
virtual void pushBack(void **storage, void *valueStorage)
virtual AnyIterator begin(void *storage)
virtual AnyReference dereference(void *storage)
#define QI_THREADSAFE_NEW(...)
Safe static initialization of variables.
Definition: atomic.hpp:252
_QI_BOUNCE_TYPE_METHODS(MethodsImpl)
virtual bool equals(void *s1, void *s2)
Check for iterator equality.
virtual void pushBack(void **storage, void *valueStorage)
Append an element to the end of the list.
void * adaptStorage(void **storage)
virtual TypeInterface * elementType()
virtual void next(void **storage)
Increment the iterator.
virtual AnyIterator end(void *storage)
DefaultTypeImplMethods< Storage, TypeByPointerPOD< T > > TypeImpl
static AnyReference from(const T &ref)
virtual AnyIterator begin(void *storage)
Return an iterator pointing to the first element of the list.
virtual void * initializeStorage(void *ptr=0)=0
virtual size_t size(void *storage)