libqi-api  2.8.7.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
stringtypeinterface.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_DETAIL_TYPESTRING_HXX_
8 #define _QITYPE_DETAIL_TYPESTRING_HXX_
9 
10 #include <algorithm>
11 #include <qi/os.hpp>
13 
14 namespace qi
15 {
16  inline std::string StringTypeInterface::getString(void* storage)
17  {
18  ManagedRawString raw = get(storage);
19  std::string res(raw.first.first, raw.first.second);
20  if (raw.second)
21  raw.second(raw.first);
22  return res;
23  }
24 
25  inline void StringTypeInterface::set(void** storage, const std::string& val)
26  {
27  set(storage, val.c_str(), val.size());
28  }
29 
31  {
32  public:
34  ManagedRawString get(void* storage) override
35  {
36  std::string* ptr = (std::string*)Methods::ptrFromStorage(&storage);
37  return ManagedRawString(RawString(const_cast<char*>(ptr->c_str()), ptr->size()),
38  Deleter());
39  }
40  void set(void** storage, const char* value, size_t sz) override
41  {
42  std::string* ptr = (std::string*)Methods::ptrFromStorage(storage);
43  ptr->assign(value, sz);
44  }
45 
46  _QI_BOUNCE_TYPE_METHODS(Methods);
47  };
48 
49  template<>
50  class TypeImpl<std::string>: public StringTypeInterfaceImpl
51  {};
52 
54  {
55  public:
56  ManagedRawString get(void* storage) override
57  {
58  return ManagedRawString(RawString((char*)storage, strlen((char*)storage)),
59  Deleter());
60  }
61  void set(void** storage, const char* ptr, size_t sz) override
62  {
63  *(char**)storage = qi::os::strdup(ptr);
64  }
65  void* clone(void* src) override
66  {
67  return qi::os::strdup((char*)src);
68  }
69  void destroy(void* src) override
70  {
71  free(src);
72  }
75  };
76 
77  template<>
78  class TypeImpl<char*>: public TypeCStringImpl
79  {};
80 
81 
82  template<int I> class TypeImpl<char [I]>: public StringTypeInterface
83  {
84  public:
85  void* clone(void* src) override
86  {
87  char* res = new char[I];
88  memcpy(res, src, I);
89  return res;
90  }
91  void destroy(void* ptr) override
92  {
93  delete[] (char*)ptr;
94  }
95  ManagedRawString get(void* storage) override
96  {
97  return ManagedRawString(RawString((char*)storage, I-1),
98  Deleter());
99  }
100  void set(void** storage, const char* ptr, size_t sz) override
101  {
102  qiLogCategory("qitype.typestring");
103  // haha...no
104  qiLogWarning() << "set on C array not implemented";
105  }
106 
109  };
110 
111  template<class Func, class... Args >
112  auto callWithInstance(Func&& f, Args&&... args)
113  -> decltype(std::forward<Func>(f)(std::forward<Args>(args)...))
114  {
115  return std::forward<Func>(f)(std::forward<Args>(args)...);
116  }
117 
118  template<class Func, class Obj, class... Args >
119  auto callWithInstance(Func&& f, Obj&& o, Args&&... args)
120  -> decltype((std::forward<Obj>(o).*std::forward<Func>(f))(std::forward<Args>(args)...))
121  {
122  return (std::forward<Obj>(o).*std::forward<Func>(f))(std::forward<Args>(args)...);
123  }
124 
126  {
129  }
130 
132  {
133  const auto size = s.size() + 1;
134  auto strKeptAlive = new char[size]();
135  std::copy(begin(s), end(s), strKeptAlive);
137  [](const StringTypeInterface::RawString& rawStr){ delete[] rawStr.first; });
138  }
139 
147  template<typename T, typename F> class TypeEquivalentString: public StringTypeInterface
148  {
149  public:
152 
153  void set(void** storage, const char* ptr, size_t sz) override
154  {
155  T* inst = (T*)ptrFromStorage(storage);
156  *inst = T(std::string(ptr, sz));
157  }
158 
159  ManagedRawString get(void* storage) override
160  {
161  T* ptr = (T*)Impl::ptrFromStorage(&storage);
163  }
164 
167  };
168 
169  template<typename T, typename F>
171  {
172  return new TypeEquivalentString<T, F>(f);
173  }
174 }
175 
179 #define QI_EQUIVALENT_STRING_REGISTER(type, func) \
180  static bool BOOST_PP_CAT(__qi_registration, __COUNTER__) QI_ATTR_UNUSED \
181  = qi::registerType(qi::typeId<type>(), qi::makeTypeEquivalentString((type*)0, func))
182 
183 #endif // _QITYPE_DETAIL_TYPESTRING_HXX_
void set(void **storage, const char *ptr, size_t sz) override
Set the value of the string.
virtual void * ptrFromStorage(void **)=0
#define _QI_BOUNCE_TYPE_METHODS_NOCLONE(Bounce)
Implement all methods of Type except clone/destroy as bouncers to Bouncer.
Definition: typeimpl.hxx:266
#define QI_API
Definition: api.hpp:33
void set(void **storage, const char *value, size_t sz) override
Set the value of the string.
StringTypeInterface * makeTypeEquivalentString(T *, F f)
void set(void **storage, const char *ptr, size_t sz) override
Set the value of the string.
#define qiLogCategory(Cat)
Definition: log.hpp:53
boost::function< void(const RawString &)> Deleter
void destroy(void *ptr) override
Free all resources of a storage.
DefaultTypeImplMethods< T, TypeByPointerPOD< T >> Impl
StringTypeInterface::ManagedRawString makeManagedString(const std::string &s)
std::pair< RawString, Deleter > ManagedRawString
#define qiLogWarning(...)
Log in warning mode.
Definition: log.hpp:109
void destroy(void *src) override
Free all resources of a storage.
#define _QI_BOUNCE_TYPE_METHODS(Bounce)
Implement all methods of Type as bouncers to Bouncer.
Definition: typeimpl.hxx:273
void set(void **storage, const std::string &value)
Set the value of the string.
auto callWithInstance(Func &&f, Args &&...args) -> decltype(std::forward< Func >(f)(std::forward< Args >(args)...))
std::pair< char *, size_t > RawString
T src(const std::atomic< T > &x)
Definition: atomic.hpp:318
std::string getString(void *storage)
Get a copy of the string value.
static void * ptrFromStorage(void **storage)
Definition: typeimpl.hxx:238
void * clone(void *src) override
Allocate a storage and copy the value given as an argument.
char * strdup(const char *src)
Implement POSIX compliant strdup.
void * clone(void *src) override
Allocate a storage and copy the value given as an argument.
void set(void **storage, const char *ptr, size_t sz) override
Set the value of the string.