19 #ifndef PDB_METHODCALLLAMBDA_H
20 #define PDB_METHODCALLLAMBDA_H
43 template <
typename ReturnType,
typename ClassType>
45 std::string methodName,
47 std::string returnTypeName,
48 ReturnType (ClassType::*arg)(),
49 std::function<
bool(std::string&,
TupleSetPtr,
int)> columnBuilder,
51 PDB_COUT <<
"makeLambdaFromMethod: input type code is " << var.getExactTypeInfoValue() << std::endl;
73 template <
typename ReturnType,
typename ClassType>
75 std::string methodName,
77 std::string returnTypeName,
78 ReturnType (ClassType::*arg)(),
79 std::function<
bool(std::string&,
TupleSetPtr,
int)> columnBuilder,
80 std::function<SimpleComputeExecutorPtr(TupleSpec&, TupleSpec&, TupleSpec&)> getExecutor) {
82 PDB_COUT <<
"makeLambdaFromMethod: input type code is " << var.getExactTypeInfoValue() << std::endl;
99 template <
bool B,
typename InputType>
100 auto tryReference(InputType& arg) ->
typename std::enable_if_t<B, InputType*> {
111 template <
bool B,
typename InputType>
112 auto tryReference(InputType arg) ->
typename std::enable_if_t<!B, InputType*> {
113 InputType* temp =
nullptr;
122 #define makeLambdaFromMethod(VAR, METHOD) \
123 (makeLambdaUsingMethod( \
124 getTypeName<typename std::remove_reference<decltype(*VAR)>::type>(), \
125 std::string(#METHOD), \
127 getTypeName<typename std::remove_reference<decltype(*VAR)>::type>(), \
128 &std::remove_reference<decltype(*VAR)>::type::METHOD, \
129 [](std::string& pleaseCreateThisType, TupleSetPtr input, int outAtt) { \
130 if (pleaseCreateThisType == \
131 getTypeName<typename std::remove_reference<decltype(VAR->METHOD())>::type>()) { \
132 std::vector<typename std::remove_reference<decltype(VAR->METHOD())>::type>* \
133 outColumn = new std::vector< \
134 typename std::remove_reference<decltype(VAR->METHOD())>::type>; \
135 input->addColumn(outAtt, outColumn, true); \
139 if (pleaseCreateThisType == \
141 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>()) { \
142 std::vector<Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>* \
143 outColumn = new std::vector< \
144 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>; \
145 input->addColumn(outAtt, outColumn, true); \
151 [](TupleSpec& inputSchema, TupleSpec& attsToOperateOn, TupleSpec& attsToIncludeInOutput) { \
154 TupleSetPtr output = std::make_shared<TupleSet>(); \
158 TupleSetSetupMachinePtr myMachine = \
159 std::make_shared<TupleSetSetupMachine>(inputSchema, attsToIncludeInOutput); \
162 std::vector<int> matches = myMachine->match(attsToOperateOn); \
163 int whichAtt = matches[0]; \
166 int outAtt = attsToIncludeInOutput.getAtts().size(); \
168 return std::make_shared<SimpleComputeExecutor>(output, [=](TupleSetPtr input) { \
172 if (std::is_reference<decltype(VAR->METHOD())>::value) { \
175 myMachine->setup(input, output); \
179 std::vector<typename std::remove_reference<decltype(VAR)>::type>& \
181 input->getColumn<typename std::remove_reference<decltype(VAR)>::type>( \
185 if (!output->hasColumn(outAtt)) { \
187 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>* \
188 outColumn = new std::vector<Ptr< \
189 typename std::remove_reference<decltype(VAR->METHOD())>::type>>; \
190 output->addColumn(outAtt, outColumn, true); \
195 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>& \
196 outColumn = output->getColumn< \
197 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>( \
201 int numTuples = inputColumn.size(); \
202 outColumn.resize(numTuples); \
203 for (int i = 0; i < numTuples; i++) { \
205 tryReference<std::is_reference<decltype(VAR->METHOD())>::value>( \
206 inputColumn[i]->METHOD()); \
208 outColumn = output->getColumn< \
209 Ptr<typename std::remove_reference<decltype(VAR->METHOD())>::type>>( \
218 myMachine->setup(input, output); \
222 std::vector<typename std::remove_reference<decltype(VAR)>::type>& \
224 input->getColumn<typename std::remove_reference<decltype(VAR)>::type>( \
228 if (!output->hasColumn(outAtt)) { \
229 std::vector<typename std::remove_reference<decltype( \
230 VAR->METHOD())>::type>* outColumn = \
232 typename std::remove_reference<decltype(VAR->METHOD())>::type>; \
233 output->addColumn(outAtt, outColumn, true); \
237 std::vector<typename std::remove_reference<decltype(VAR->METHOD())>::type>& \
238 outColumn = output->getColumn< \
239 typename std::remove_reference<decltype(VAR->METHOD())>::type>( \
243 int numTuples = inputColumn.size(); \
244 outColumn.resize(numTuples); \
245 for (int i = 0; i < numTuples; i++) { \
246 outColumn[i] = inputColumn[i]->METHOD(); \
255 #endif //PDB_METHODCALLLAMBDA_H
std::shared_ptr< SimpleComputeExecutor > SimpleComputeExecutorPtr
std::shared_ptr< TupleSet > TupleSetPtr
auto tryReference(InputType &arg) -> typename std::enable_if_t< B, InputType * >
LambdaTree< std::enable_if_t< std::is_reference< ReturnType >::value, Ptr< typename std::remove_reference< ReturnType >::type > > > makeLambdaUsingMethod(std::string inputTypeName, std::string methodName, Handle< ClassType > &var, std::string returnTypeName, ReturnType(ClassType::*arg)(), std::function< bool(std::string &, TupleSetPtr, int)> columnBuilder, std::function< SimpleComputeExecutorPtr(TupleSpec &, TupleSpec &, TupleSpec &)> getExecutor)