COVISE Core
tokenbuffer_util.h
Go to the documentation of this file.
1#ifndef COVISE_TOKEN_BUFFER_UTIL_H
2#define COVISE_TOKEN_BUFFER_UTIL_H
3
4#include "tokenbuffer.h"
5
6#include <type_traits>
7#include <tuple>
8namespace covise {
9
10
11namespace detail {
12
13//helper to construct messages out of tokenbuffer
14template<typename T>
16 T t{};
17 tb >> t;
18 return t;
19}
20//to get the c++14 syntax of std::get<T>(tuple)
21template<size_t Pos, typename T, typename U, typename...Args>
22struct Finder
23{
24 constexpr inline size_t operator()() const {
25 return Finder<Pos + 1, T, Args...>{}();
26 }
27};
28
29template<size_t Pos, typename T, typename...Args>
30struct Finder<Pos, T, T, Args...>
31{
32 constexpr inline size_t operator()() const {
33 return Pos;
34 }
35};
36
37template<typename T, typename...Args>
38const T& get(const std::tuple<Args...>& t) {
39 constexpr size_t pos = Finder < size_t{}, T, Args... > {}();
40 return std::get<pos>(t);
41}
42
43template<typename T, typename...Args>
44T& get(std::tuple<Args...>& t) {
45 constexpr size_t pos = Finder < size_t{}, T, Args... > {}();
46 return std::get<pos>(t);
47}
48//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
49
50template<typename T>
51constexpr bool isTBClass() { return false; }
52
53template<typename STDTuple>
54void readTokenBufferSingle(STDTuple& tuple, covise::TokenBuffer& tb) {
55 return;
56}
57
58template<typename STDTuple, typename T, typename...Args>
59void readTokenBufferSingle(STDTuple& tuple, covise::TokenBuffer& tb) {
60 static_assert(detail::isTBClass<T>(), "type is not created with CREATE_TB_CLASS");
61 T& val = detail::get<T>(tuple);
62 tb >> val.value;
63 readTokenBufferSingle<STDTuple, Args...>(tuple, tb);
64}
65
66template<typename Stream, size_t I = 0, typename... Tp>
67inline typename std::enable_if<I == sizeof...(Tp), void>::type
68print(Stream& s, const std::tuple<Tp...>& t)
69{ }
70
71template<typename Stream, std::size_t I = 0, typename... Tp>
72inline typename std::enable_if < I < sizeof...(Tp), void>::type
73 print(Stream& s, const std::tuple<Tp...>& t)
74{
76 print<Stream, I + 1, Tp...>(s, t);
77}
78
79} //detail
80
81
82
83template<typename...Args>
84struct TbReadVal {
85 std::tuple<Args...> value;
86 template<typename T>
87 const T& get() const {
88 return detail::get<T>(value);
89 }
90
91
92};
93
94template<typename...Args>
96 TbReadVal<Args...> retval;
97 detail::readTokenBufferSingle< std::tuple<Args...>, Args...>(retval.value, tb);
98 return retval;
99}
100
101template<typename Stream, typename...Args>
102Stream& operator<<(Stream& s, const TbReadVal<Args...>& dt)
103{
104 detail::print(s, dt.value);
105 return s;
106}
107
108#define CREATE_TB_CLASS(type, name)\
109 struct name{\
110 type value;\
111 operator type()const {return value;}\
112 };\
113 template<typename Stream>\
114 Stream &operator<<(Stream &s, const name& t){\
115 s << #name << ": " << t.value << ", ";\
116 return s;\
117 }\
118 namespace detail{\
119 template<>\
120 constexpr bool isTBClass<name>() { return true; }\
121 }
122}
123
124#endif
GLsizei const GLfloat * value
Definition: khronos-glext.h:6760
GLdouble GLdouble t
Definition: khronos-glext.h:6449
GLuint GLfloat * val
Definition: khronos-glext.h:7898
GLdouble s
Definition: khronos-glext.h:6441
GLenum type
Definition: khronos-glext.h:6279
list of all chemical elements
Definition: coConfig.h:27
QTextStream & operator<<(QTextStream &out, const coConfigEntryStringList list)
Definition: coConfigEntryString.cpp:159
TbReadVal< Args... > readTokenBuffer(covise::TokenBuffer &tb)
Definition: tokenbuffer_util.h:95
std::enable_if< I==sizeof...(Tp), void >::type print(Stream &s, const std::tuple< Tp... > &t)
Definition: tokenbuffer_util.h:68
void readTokenBufferSingle(STDTuple &tuple, covise::TokenBuffer &tb)
Definition: tokenbuffer_util.h:54
T get(TokenBuffer &tb)
Definition: tokenbuffer_util.h:15
constexpr bool isTBClass()
Definition: tokenbuffer_util.h:51
Definition: tokenbuffer.h:79
Definition: tokenbuffer_util.h:23
constexpr size_t operator()() const
Definition: tokenbuffer_util.h:24
constexpr size_t operator()() const
Definition: tokenbuffer_util.h:32
Definition: tokenbuffer_util.h:84
const T & get() const
Definition: tokenbuffer_util.h:87
std::tuple< Args... > value
Definition: tokenbuffer_util.h:85