Directory: | ./ |
---|---|
File: | src/phoenix_composeType.h |
Date: | 2024-12-09 11:00:39 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 61 | 63 | 96.8% |
Branches: | 48 | 71 | 67.6% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /*************************************** | ||
2 | Auteur : Pierre Aubert | ||
3 | Mail : pierre.aubert@lapp.in2p3.fr | ||
4 | Licence : CeCILL-C | ||
5 | ****************************************/ | ||
6 | |||
7 | #ifndef __PHOENIX_COMPOSETYPE_H__ | ||
8 | #define __PHOENIX_COMPOSETYPE_H__ | ||
9 | |||
10 | #include <map> | ||
11 | |||
12 | #include "phoenix_ptype.h" | ||
13 | #include "type_stream_get_type.h" | ||
14 | #include "PComposeType.h" | ||
15 | |||
16 | #define TYPE_STREAM_VECTOR 11lu | ||
17 | #define TYPE_STREAM_LIST 12lu | ||
18 | #define TYPE_STREAM_MAP 13lu | ||
19 | |||
20 | bool checkValue(const std::string & testName, const PComposeType & value, const PComposeType & reference); | ||
21 | bool checkValue(const std::string & testName, const std::vector<PComposeType> & vecValueType, const std::vector<PComposeType> & vecReferenceType); | ||
22 | std::string ts_ptypeToStr(PType type); | ||
23 | std::string ts_pveccomposeTypeToStr(const std::vector<PComposeType> & vecComposeType); | ||
24 | std::string ts_pcomposeTypeToStr(const PComposeType & composeType); | ||
25 | std::string ts_pcomposeVarToStr(const PComposeVar & composeVar); | ||
26 | std::string ts_protoTypeToStr(const PFunctionPrototype & prototype); | ||
27 | std::string ts_pfunctioncallToStr(const PFunctionCall & functionCall); | ||
28 | |||
29 | |||
30 | ///@brief Generic DataStream class | ||
31 | template<typename T> | ||
32 | struct TypeStream{ | ||
33 | ///Get the PComposeType of a generic type | ||
34 | /** @return PComposeType of a std::vector | ||
35 | */ | ||
36 | 164 | static PComposeType getType(){ | |
37 | 164 | PComposeType tmpType; | |
38 |
2/2✓ Branch 1 taken 112 times.
✓ Branch 4 taken 112 times.
|
164 | tmpType.setType(ts_getType<T>()); |
39 | 164 | return tmpType; | |
40 | } | ||
41 | ///Convert the generic type into a string | ||
42 | /** @return corresponding string | ||
43 | */ | ||
44 | 14 | static std::string getTypeToStr(){ | |
45 | 14 | return ts_getTypeToStr<T>(); | |
46 | } | ||
47 | }; | ||
48 | |||
49 | ///@brief Generic std::vector type abstraction | ||
50 | template<typename T> | ||
51 | struct TypeStream<std::vector<T> >{ | ||
52 | ///Get the PComposeType of a std::vector | ||
53 | /** @return PComposeType of a std::vector | ||
54 | */ | ||
55 | 1 | static PComposeType getType(){ | |
56 | 1 | PComposeType tmpType; | |
57 | //The currnet type if a std::vector | ||
58 |
1/1✓ Branch 1 taken 1 times.
|
1 | tmpType.setType(TYPE_STREAM_VECTOR); |
59 | //Let's get the sub type inside the vector | ||
60 |
3/3✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
|
1 | tmpType.getVecType().push_back(TypeStream<T>::getType()); |
61 | 1 | return tmpType; | |
62 | } | ||
63 | ///Convert the std::vector< T > type into a string | ||
64 | /** @return corresponding string | ||
65 | */ | ||
66 | 1 | static std::string getTypeToStr(){ | |
67 |
2/2✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
|
1 | return "std::vector<" + TypeStream<T>::getTypeToStr() + " >"; |
68 | } | ||
69 | }; | ||
70 | |||
71 | ///@brief Generic std::list type abstraction | ||
72 | template<typename T> | ||
73 | struct TypeStream<std::list<T> >{ | ||
74 | ///Get the PComposeType of a std::list | ||
75 | /** @return PComposeType of a std::list | ||
76 | */ | ||
77 | 1 | static PComposeType getType(){ | |
78 | 1 | PComposeType tmpType; | |
79 | //The currnet type if a std::list | ||
80 |
1/1✓ Branch 1 taken 1 times.
|
1 | tmpType.setType(TYPE_STREAM_LIST); |
81 | //Let's get the sub type inside the list | ||
82 |
3/3✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
|
1 | tmpType.getVecType().push_back(TypeStream<T>::getType()); |
83 | 1 | return tmpType; | |
84 | } | ||
85 | ///Convert the std::list< T > type into a string | ||
86 | /** @return corresponding string | ||
87 | */ | ||
88 | 1 | static std::string getTypeToStr(){ | |
89 |
2/2✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
|
1 | return "std::list<" + TypeStream<T>::getTypeToStr() + " >"; |
90 | } | ||
91 | }; | ||
92 | |||
93 | ///@brief Generic std::list type abstraction | ||
94 | template<typename T, typename U> | ||
95 | struct TypeStream<std::map<T, U> >{ | ||
96 | ///Get the PComposeType of a std::list | ||
97 | /** @return PComposeType of a std::list | ||
98 | */ | ||
99 | 1 | static PComposeType getType(){ | |
100 | 1 | PComposeType tmpType; | |
101 | //The currnet type if a std::list | ||
102 |
1/1✓ Branch 1 taken 1 times.
|
1 | tmpType.setType(TYPE_STREAM_MAP); |
103 | //Let's get the sub type inside the list | ||
104 |
3/3✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
|
1 | tmpType.getVecType().push_back(TypeStream<T>::getType()); |
105 |
3/3✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
|
1 | tmpType.getVecType().push_back(TypeStream<U>::getType()); |
106 | 1 | return tmpType; | |
107 | } | ||
108 | ///Convert the std::list< T > type into a string | ||
109 | /** @return corresponding string | ||
110 | */ | ||
111 | 2 | static std::string getTypeToStr(){ | |
112 |
5/5✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 11 taken 2 times.
✓ Branch 14 taken 2 times.
|
2 | return "std::map<" + TypeStream<T>::getTypeToStr() + ", " + TypeStream<U>::getTypeToStr() + " >"; |
113 | } | ||
114 | }; | ||
115 | |||
116 | template<typename T> | ||
117 | std::string phoenix_getTypeToStr(); | ||
118 | template<typename T> | ||
119 | std::string phoenix_getTypeToStr(const T & data); | ||
120 | |||
121 | template<typename T> | ||
122 | PComposeType phoenix_getComposeType(); | ||
123 | template<typename T> | ||
124 | PComposeType phoenix_getComposeType(const T & data); | ||
125 | |||
126 | template<typename T> | ||
127 | PComposeVar phoenix_getComposeVar(const std::string & name); | ||
128 | |||
129 | ///@brief Serialise a call type into a PComposeType | ||
130 | template <int First, int Last> | ||
131 | struct PSerialiseCallType{ | ||
132 | ///Create the corresponding vector of PComposeType to a function call | ||
133 | /** @param[out] vecType : vector of PComposeType of the function call | ||
134 | * @param tupleCall : called tuple of function parameters | ||
135 | * @return true on success, false otherwise | ||
136 | */ | ||
137 | template <typename T> | ||
138 | 86 | static bool makeType(std::vector<PComposeType> & vecType, const T & tupleCall){ | |
139 | 86 | bool b(true); | |
140 | if(First < Last){ | ||
141 | 86 | auto value = std::get<First>(tupleCall); | |
142 |
2/2✓ Branch 1 taken 43 times.
✓ Branch 4 taken 43 times.
|
86 | vecType.push_back(phoenix_getComposeType(value)); |
143 | 86 | b &= PSerialiseCallType<First+1, Last>::makeType(vecType, tupleCall); | |
144 | } | ||
145 | 86 | return b; | |
146 | } | ||
147 | ///Create the corresponding vector of serialised parameters to a function call | ||
148 | /** @param[out] vecParam : vector of serialised parameters of the function call | ||
149 | * @param tupleCall : called tuple of function parameters | ||
150 | * @return true on success, false otherwise | ||
151 | */ | ||
152 | template <typename T> | ||
153 | 80 | static bool makeParam(std::vector<std::vector<char> > & vecParam, const T & tupleCall){ | |
154 | 80 | bool b(true); | |
155 | if(First < Last){ | ||
156 | 80 | auto value = std::get<First>(tupleCall); | |
157 |
1/1✓ Branch 1 taken 40 times.
|
80 | size_t dataSize(data_size(value)); |
158 | 80 | std::vector<char> vecTmp; | |
159 |
1/1✓ Branch 1 taken 40 times.
|
80 | vecTmp.resize(dataSize); |
160 | 80 | char* iter = (char*)vecTmp.data(); | |
161 |
2/3✓ Branch 1 taken 40 times.
✓ Branch 3 taken 40 times.
✗ Branch 4 not taken.
|
80 | if(data_message_save(iter, value)){ |
162 |
1/1✓ Branch 1 taken 40 times.
|
80 | vecParam.push_back(vecTmp); |
163 | 80 | b &= PSerialiseCallType<First+1, Last>::makeParam(vecParam, tupleCall); | |
164 | }else{ | ||
165 | ✗ | std::cerr << "makeParam<"<<First<<", "<<Last<<"> : cannot serialise value '" << value <<"' of type '"<<phoenix_getTypeToStr(value)<<"' in message" << std::endl; | |
166 | ✗ | b = false; | |
167 | } | ||
168 | 80 | } | |
169 | 80 | return b; | |
170 | } | ||
171 | }; | ||
172 | |||
173 | ///@brief Serialise a call type into a PComposeType | ||
174 | template <int N> | ||
175 | struct PSerialiseCallType<N, N>{ | ||
176 | ///End function which creates the corresponding vector of PComposeType to a function call | ||
177 | /** @param[out] vecType : vector of PComposeType of the function call | ||
178 | * @param tupleCall : called tuple of function parameters | ||
179 | * @return true on success, false otherwise | ||
180 | */ | ||
181 | template <typename T> | ||
182 | 86 | static bool makeType(std::vector<PComposeType> & vecType, const T & tupleCall){return true;} | |
183 | ///End function which creates the corresponding vector of serialised parameters to a function call | ||
184 | /** @param[out] vecParam : vector of serialised parameters of the function call | ||
185 | * @param tupleCall : called tuple of function parameters | ||
186 | * @return true on success, false otherwise | ||
187 | */ | ||
188 | template <typename T> | ||
189 | 80 | static bool makeParam(std::vector<std::vector<char> > & vecParam, const T & tupleCall){return true;} | |
190 | }; | ||
191 | |||
192 | |||
193 | ///Get the corresponding prototype of a function | ||
194 | /** @param functionName : name of the function | ||
195 | * @param _ : the given function | ||
196 | * @return corresponding PFunctionPrototype | ||
197 | */ | ||
198 | template <typename R, typename... T> | ||
199 | 3 | PFunctionPrototype phoenix_getPrototype(const std::string & functionName, R (*_)(T...)){ | |
200 |
1/1✓ Branch 1 taken 3 times.
|
3 | PFunctionPrototype prototype; |
201 |
1/1✓ Branch 1 taken 3 times.
|
3 | prototype.setName(functionName); |
202 |
3/3✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 7 taken 3 times.
|
3 | prototype.getVecReturnType().push_back(phoenix_getComposeType<R>()); |
203 | 3 | std::tuple<T...> args = std::tuple<T...>(); | |
204 |
2/2✓ Branch 1 taken 3 times.
✓ Branch 4 taken 3 times.
|
3 | PSerialiseCallType<0, std::tuple_size<std::tuple<T... > >{} >::makeType(prototype.getVecParam(), args); |
205 | 6 | return prototype; | |
206 | } | ||
207 | |||
208 | ///Serialise parameters call | ||
209 | /** @param[out] call : function call to be updated | ||
210 | * @param[out] functionName : name of the function | ||
211 | * @param __args : arguments | ||
212 | */ | ||
213 | template<typename... _Args> | ||
214 | 20 | void phoenix_serialiseCallParam(PFunctionCall & call, const std::string & functionName, _Args&... __args){ | |
215 |
1/1✓ Branch 1 taken 20 times.
|
20 | std::tuple<_Args... > vecCallParam = std::make_tuple(__args...); |
216 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 4 taken 20 times.
|
20 | call.getPrototype().setName(functionName); |
217 |
3/3✓ Branch 1 taken 20 times.
✓ Branch 4 taken 20 times.
✓ Branch 7 taken 20 times.
|
20 | PSerialiseCallType<0, std::tuple_size<std::tuple<_Args... > >{} >::makeType(call.getPrototype().getVecParam(), vecCallParam); |
218 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 4 taken 20 times.
|
20 | PSerialiseCallType<0, std::tuple_size<std::tuple<_Args... > >{} >::makeParam(call.getVecParam(), vecCallParam); |
219 | 20 | } | |
220 | |||
221 | |||
222 | #include "phoenix_composeType_impl.h" | ||
223 | |||
224 | #endif | ||
225 |