summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJose Bollo <jose.bollo@iot.bzh>2019-04-12 11:18:46 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2019-04-23 11:22:09 +0200
commit6401efb14339925e696a65eea8e8548f1fddf3ba (patch)
treefea29c2a65862419572aaaa2a8e66554a7d3589e /include
parent13457f6458e1f604e437ce7a9a680c8703078fbf (diff)
binding-wrap: Rework of context handling
The C++ wrapper for handling contexts has to be improved. This is a proposition of improvement. Change-Id: I7df36383f427d109356bdf4df573cba4b6e6ec05 Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'include')
-rw-r--r--include/afb/c++/binding-wrap.hpp60
1 files changed, 48 insertions, 12 deletions
diff --git a/include/afb/c++/binding-wrap.hpp b/include/afb/c++/binding-wrap.hpp
index a23e5537..6af3f845 100644
--- a/include/afb/c++/binding-wrap.hpp
+++ b/include/afb/c++/binding-wrap.hpp
@@ -258,8 +258,6 @@ public:
void failf(const char *error, const char *info, ...) const;
void failv(const char *error, const char *info, va_list args) const;
- template < class T > T *context() const;
-
void addref() const;
void unref() const;
@@ -294,6 +292,54 @@ public:
int get_uid() const;
json_object *get_client_info() const;
+
+ template < class T = void >
+ class contextclass {
+
+ friend class req;
+ afb_req_t req_;
+ contextclass(afb_req_t r) : req_(r) {}
+
+ public:
+ inline operator T *() const { return get(); }
+ inline operator T &() const { return *get(); }
+ inline T* get() const {
+ return reinterpret_cast<T*>(
+ afb_req_context(req_, 0,
+ nullptr,
+ nullptr,
+ nullptr));
+ }
+
+ inline void set(T *value, void (*destroyer)(T*) = [](T*t){delete t;}) const {
+ afb_req_context(req_, 1,
+ nullptr,
+ reinterpret_cast<void(*)(void*)>(destroyer),
+ reinterpret_cast<void*>(value));
+ }
+
+ inline void unset() { set(nullptr); }
+ inline void clear() { set(nullptr); }
+
+ inline T *lazy(T *(*allocator)() = []()->T*{return new T();}, void (*destroyer)(T*) = [](T*t){delete t;}) const {
+ return reinterpret_cast<T*>(
+ afb_req_context(req_, 0,
+ [allocator](void*)->T*{return allocator();},
+ reinterpret_cast<void(*)(void*)>(destroyer),
+ nullptr));
+ }
+
+ template <class I>
+ inline T *lazy(I *i, T *(*allocator)(I*) = [](I*i)->T*{return new T(i);}, void (*destroyer)(T*) = [](T*t){delete t;}) const {
+ return reinterpret_cast<T*>(
+ afb_req_context(req_, 0,
+ [allocator](void*i)->T*{return allocator(reinterpret_cast<I*>(i));},
+ reinterpret_cast<void(*)(void*)>(destroyer),
+ reinterpret_cast<void*>(i)));
+ }
+ };
+
+ template < class T > contextclass<T> context() const { return contextclass<T>(req_); }
};
/*************************************************************************/
@@ -476,16 +522,6 @@ inline void req::failf(const char *error, const char *info, ...) const
va_end(args);
}
-template < class T >
-inline T *req::context() const
-{
- T* (*creater)(void*) = [](){return new T();};
- void (*freer)(T*) = [](T*t){delete t;};
- return reinterpret_cast<T*>(afb_req_context(req_, 0,
- reinterpret_cast<void *(*)(void*)>(creater),
- reinterpret_cast<void (*)(void*)>(freer), nullptr));
-}
-
inline void req::addref() const { afb_req_addref(req_); }
inline void req::unref() const { afb_req_unref(req_); }