9#ifndef CLASSDESC_RESTPROCESS_BASE_H
10#define CLASSDESC_RESTPROCESS_BASE_H
13#include "multiArray.h"
15#include "polyRESTProcessBase.h"
24#ifndef REST_PROCESS_BUFFER
25#include "json_pack_base.h"
26#define REST_PROCESS_BUFFER json_pack_t
32 using RPPtr=std::shared_ptr<RESTProcessBase>;
50 virtual ~RESTProcessBase() {}
53 virtual RPPtr
process(
const string& path,
const REST_PROCESS_BUFFER& arguments)=0;
54 virtual REST_PROCESS_BUFFER asBuffer()
const=0;
60 virtual std::string
type()
const=0;
69 virtual const object* getConstClassdescObject() {
return nullptr;}
74 virtual bool isConst()
const {
return false;}
76 virtual unsigned arity()
const {
return 0;}
78 virtual size_t size()
const {
return 0; }
80 virtual RPPtr
getElem(
const REST_PROCESS_BUFFER&);
83 virtual RPPtr
setElem(
const REST_PROCESS_BUFFER& index,
const REST_PROCESS_BUFFER& value)
86 virtual void insert(
const REST_PROCESS_BUFFER& value) {}
88 virtual void erase(
const REST_PROCESS_BUFFER& index) {}
90 virtual bool contains(
const REST_PROCESS_BUFFER& key)
const {
return false;}
92 virtual RPPtr
keys()
const;
100 Not<is_container<T>>,
108 Not<is_base_of<MultiArrayBase,T>>
113 typename enable_if<is_base_of<MultiArrayBase,T>, RPPtr>::T
117 typename enable_if<is_smart_ptr<T>, RPPtr>::T
129 static const unsigned maxMatchScore=1000000;
133 virtual unsigned matchScore(
const REST_PROCESS_BUFFER& arguments)
const=0;
134 REST_PROCESS_BUFFER asBuffer()
const override {
return {};}
139 std::vector<std::shared_ptr<RESTProcessFunctionBase>> overloadedFunctions;
140 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
141 REST_PROCESS_BUFFER asBuffer()
const override {
return {};}
143 std::vector<Signature> r;
144 for (
auto& i: overloadedFunctions) {
145 auto s=i->signature();
146 r.insert(r.end(),s.begin(),s.end());
151 std::string
type()
const override {
return "overloaded function";}
154 inline void convert(
char& y,
const string& x)
157 throw std::runtime_error(
"can only assign a single character string to a character variable");
161 inline void convert(
const char* y,
const string& x)
166 template <
class X,
class Y>
168 convert(Y& y,
const X& x)
171 template <
class X,
class Y>
173 convert(Y& y,
const X& x)
176 template <
class X,
class Y>
183 convert(Y& y,
const X& x)
184 {
throw std::runtime_error(typeName<X>()+
" cannot be converted to "+typeName<Y>());}
186 template <
class X,
class Y>
187 void convert(
const Y&,
const X&)
188 {
throw std::runtime_error(
"attempt to alter a const variable");}
198 convert(X& x,
const REST_PROCESS_BUFFER& j)
202 case RESTProcessType::object:
205 case RESTProcessType::array:
209 REST_PROCESS_BUFFER(arr[0])>>x;
212 case RESTProcessType::string:
219 case RESTProcessType::boolean:
226 case RESTProcessType::int_number:
233 case RESTProcessType::float_number:
240 case RESTProcessType::null:
252 convert(X& x,
const REST_PROCESS_BUFFER& j)
254 if (j.type()==RESTProcessType::array)
257 resize(x, arr.size());
261 if (xi==x.end())
break;
262 REST_PROCESS_BUFFER(ai) >> *xi++;
267 template <
class T,
int R>
270 if (j.type()==RESTProcessType::array)
276 if (xi==x.end())
break;
278 convert(target, REST_PROCESS_BUFFER(ai));
286 if (j.type()==RESTProcessType::array)
292 if (xi==x.end())
break;
293 REST_PROCESS_BUFFER(ai) >> *xi++;
300 convert(X& x,
const REST_PROCESS_BUFFER& j)
304 case RESTProcessType::array:
310 typename X::value_type v;
311 REST_PROCESS_BUFFER(ai) >> v;
316 case RESTProcessType::object:
324 void convert(std::shared_ptr<X>& x,
const REST_PROCESS_BUFFER& j)
326 if (x) convert(*x,j);
330 void convert(std::weak_ptr<X>& x,
const REST_PROCESS_BUFFER& j)
332 if (
auto s=x.lock()) convert(*s,j);
337 convert(E& x,
const REST_PROCESS_BUFFER& j)
340 x=enum_keys<E>()(tmp);
344 void convert(
const X* x,
const REST_PROCESS_BUFFER& j)
350 struct RESTProcess_t:
public std::map<std::string, RPPtr >
352 RESTProcess_t()=
default;
356 template <
class T> RESTProcess_t(
T& obj);
375 for (
auto& f: functions->overloadedFunctions)
381 functions->overloadedFunctions.emplace_back(rp);
383 else if (
auto firstFunction=dynamic_pointer_cast<RESTProcessFunctionBase>(i->second))
386 if (firstFunction->signature()==rp->
signature())
391 auto functs=std::make_shared<RESTProcessOverloadedFunction>();
392 if (firstFunction) functs->overloadedFunctions.push_back(std::move(firstFunction));
393 functs->overloadedFunctions.emplace_back(rp);
400 inline RPPtr process(
const std::string& query,
const REST_PROCESS_BUFFER& jin);
418 (
const std::string& typeName,
const std::function<
void(
const std::string& objName)>& callback=
nullptr);
422 RPPtr mapAndProcess(
const string& query,
const REST_PROCESS_BUFFER& arguments, T& a);
425 inline typename enable_if<is_default_constructible<T>,RPPtr>::T
426 mapAndProcessDummy(
const string& query,
const REST_PROCESS_BUFFER& arguments)
429 return mapAndProcess(query,arguments,
dummy);
434 mapAndProcessDummy(
const string& query,
const REST_PROCESS_BUFFER& arguments)
436 throw std::runtime_error(typeName<T>()+
" is not default constructible, but requested element doesn't exist");
440 template <
class T>
inline
443 template <
class T>
inline
451 RESTProcessObject(
T& obj): obj(obj) {}
452 std::shared_ptr<classdesc::RESTProcessBase>
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override
454 if (remainder.empty())
456 switch (arguments.type())
458 case RESTProcessType::null:
break;
459 case RESTProcessType::array:
461 auto& arr=arguments.array();
462 if (!arr.empty()) convert(obj, REST_PROCESS_BUFFER(arr[0]));
466 convert(obj, arguments);
469 return std::make_shared<RESTProcessObject>(obj);
471 return mapAndProcess(remainder, arguments, obj);
473 REST_PROCESS_BUFFER asBuffer()
const override {REST_PROCESS_BUFFER r;
return r<<obj;}
474 std::vector<Signature>
signature()
const override;
475 RESTProcess_t
list()
const override;
476 std::string
type()
const override;
479 if (is_const<T>::value)
return nullptr;
484 bool isConst()
const override {
return std::is_const<T>::value;}
486 if constexpr (is_class<T>::value)
491 RPPtr
getElem(
const REST_PROCESS_BUFFER& b)
override {
492 if constexpr (is_class<T>::value)
495 size_t index; b>>index;
502 RPPtr
setElem(
const REST_PROCESS_BUFFER& b,
const REST_PROCESS_BUFFER& value)
override
504 if constexpr (is_class<T>::value && !is_const<T>::value)
507 size_t index; b>>index;
518 template <
class T>
struct RESTProcessValueObject:
public RESTProcessObject<T>
522 template <
class...
Args>
523 RESTProcessValueObject(
Args&&... args): RESTProcessObject<T>(actual), actual(std::forward<Args>(args)...) {}
526 template <
class T>
inline
529 {
return std::make_shared<RESTProcessValueObject<T>>(x.obj);}
532 RPPtr makeRESTProcessValueObject(T&& obj)
533 {
return std::make_shared<RESTProcessValueObject<typename std::remove_reference<T>::type>>(std::forward<T>(obj));}
535 inline RPPtr makeRESTProcessValueObject(
const char* s)
536 {
return std::make_shared<RESTProcessValueObject<std::string>>(s);}
537 inline RPPtr makeRESTProcessValueObject(
const std::initializer_list<std::string>& init)
538 {
return std::make_shared<RESTProcessValueObject<std::vector<std::string>>>(init);}
543 std::shared_ptr<RESTProcessBase>
process(
const string&,
const REST_PROCESS_BUFFER&)
override
544 {
return std::make_shared<RESTProcessVoid>();}
545 REST_PROCESS_BUFFER asBuffer()
const override {
return {};}
546 std::vector<Signature>
signature()
const override {
return {};}
548 std::string
type()
const override {
return "void";}
553 {
return std::make_shared<RESTProcessVoid>();}
556 {
return std::make_shared<RESTProcessVoid>();}
570 Not<is_container<T>>,
571 Not<is_smart_ptr<T>>,
583 typename enable_if<Or<is_fundamental<T>,is_string<T>>,
void>::T
584 RESTProcessp(RESTProcess_t& repo,
const string& d, T& a)
599 inline bool startsWith(
const std::string& x,
const std::string& prefix)
600 {
return x.size()>=prefix.size() && equal(prefix.begin(), prefix.end(), x.begin());}
612 throw std::runtime_error(typeName<U>()+
" is not default constructible, but requested element doesn't exist");
621 struct Insertable:
public
624 has_member_push_back<T,void (T::*)(const typename T::value_type&)>,
625 is_default_constructible<typename T::value_type>>,
626 Not<is_const<U>>> {};
630 insert(U& o,
const REST_PROCESS_BUFFER& j) {
631 typename U::value_type v;
639 throw std::runtime_error(
"cannot insert into this sequence");
643 struct Erasable:
public
646 has_member_erase<T,typename T::iterator (T::*)(typename T::iterator)>,
647 has_member_erase<T,typename T::iterator (T::*)(typename T::const_iterator)>
649 Not<is_const<U>>> {};
654 erase(U& seq,
const REST_PROCESS_BUFFER& j)
656 size_t idx{}; convert(
idx,j);
660 std::advance(i,
idx);
667 erase(U& seq,
const REST_PROCESS_BUFFER& j)
669 throw std::runtime_error(
"cannot erase from this sequence");
675 std::advance(i,
idx);
680 if (
idx<obj.size())
return elemCommon(
idx);
681 return dummyRef<typename T::value_type>();
684 void pushBack(
const typename T::value_type& v) {
689 typename enable_if<has_member_erase<U,
typename U::iterator(U::*)(
typename U::const_iterator)>,
void>
::T
690 erase(U& o,
typename U::iterator i) {o.erase(i);}
694 erase(U& o,
typename U::const_iterator i) {}
697 typename enable_if<
Not<has_member_erase<U,
typename U::iterator(U::*)(
typename U::const_iterator)>>,
void>
::T
698 erase(U& o,
typename U::iterator i) {}
701 void eraseElem(
size_t idx) {
704 std::advance(i,
idx);
711 if (
idx<obj.size())
return elemCommon(
idx);
712 throw std::runtime_error(
"idx out of bounds");
717 RESTProcessSequence(
T& obj): obj(obj) {}
718 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
719 std::vector<Signature>
signature()
const override;
721 std::string
type()
const override {
return typeName<T>();}
722 REST_PROCESS_BUFFER asBuffer()
const override {REST_PROCESS_BUFFER r;
return r<<obj;}
724 RPPtr
getElem(
const REST_PROCESS_BUFFER& index)
override {
728 RPPtr
setElem(
const REST_PROCESS_BUFFER& index,
const REST_PROCESS_BUFFER& value)
override {
734 size_t size()
const override {
return obj.size();}
735 void insert(
const REST_PROCESS_BUFFER& value)
override {
insert(obj,value);}
736 void erase(
const REST_PROCESS_BUFFER& index)
override {
742 template <
class T>
struct RESTProcessValueSequence:
public RESTProcessSequence<T>
746 template <
class...
Args>
747 RESTProcessValueSequence(
Args&&... args): RESTProcessSequence<T>(actual), actual(std::forward<Args>(args)...) {}
750 template <
class T,
int R> RPPtr copyMultiArrayIterator(
MultiArray<T,R>& x);
751 template <
class T,
int R> RPPtr copyMultiArrayIterator(
const MultiArray<T,R>& x);
753 template <
class T> RPPtr copyMultiArrayIterator(
T& x)
754 {
return std::make_shared<RESTProcessObject<T>>(x);}
760 template <
class...
Args>
761 RESTProcessMultiArray(
Args&&... args): actual(std::forward<Args>(args)...) {}
762 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
763 REST_PROCESS_BUFFER asBuffer()
const override {
764 REST_PROCESS_BUFFER r;
767 std::vector<Signature>
signature()
const override {
return {};}
769 std::string
type()
const override {
return "typeName<T>()";}
771 RPPtr
getElem(
const REST_PROCESS_BUFFER& index)
override {
773 if (
idx<actual.size())
774 return copyMultiArrayIterator(actual[
idx]);
775 return std::make_shared<RESTProcessVoid>();
777 RPPtr
setElem(
const REST_PROCESS_BUFFER& index,
const REST_PROCESS_BUFFER& value)
override {
779 if (
idx<actual.size())
781 auto elem=actual[
idx];
783 return copyMultiArrayIterator(elem);
785 return std::make_shared<RESTProcessVoid>();
787 size_t size()
const override {
return actual.size();}
790 template <
class T,
int R> RPPtr copyMultiArrayIterator(MultiArray<T,R>& x)
791 {
return std::make_shared<RESTProcessMultiArray<MultiArray<T,R>>>(x);}
792 template <
class T,
int R> RPPtr copyMultiArrayIterator(
const MultiArray<T,R>& x)
793 {
return std::make_shared<RESTProcessMultiArray<MultiArray<T,R>>>(x);}
796 public RESTProcessSequence<classdesc::MultiArray<T,1>>
800 template <
class...
Args>
801 RESTProcessMultiArray(
Args&&... args): RESTProcessSequence<classdesc::MultiArray<T,1>>(actual), actual(std::forward<Args>(args)...) {}
802 RPPtr
getElem(
const REST_PROCESS_BUFFER& index) {
804 return std::make_shared<RESTProcessObject<T>>(this->elem(
idx));
806 RPPtr
setElem(
const REST_PROCESS_BUFFER& index,
const REST_PROCESS_BUFFER& value) {
808 auto& v=this->elem(
idx);
810 return std::make_shared<RESTProcessObject<T>>(v);
812 size_t size()
const override {
return actual.size();}
821 Not<is_base_of<MultiArrayBase,T>>
823 RESTProcessp(RESTProcess_t& repo,
const string& d, T& a)
824 {repo.add(d,
new RESTProcessSequence<T>(a));}
835 typedef typename std::remove_const<T>::type type;
838 template <
class K,
class V>
841 typedef std::pair<K, V> type;
848 typename MutableValueType<typename T::value_type>::type v;
849 convert(v,arguments);
850 if (!obj.insert(v).second)
851 throw std::runtime_error(
"key already exists, not inserted");
858 throw std::runtime_error(
"cannot insert data into a constant container");
862 void RPAC_erase(T& obj,
const REST_PROCESS_BUFFER& arguments)
864 typename T::key_type k;
865 convert(k,arguments);
871 void RPAC_erase(
const T&,
const REST_PROCESS_BUFFER& argument)
873 throw std::runtime_error(
"cannot erase data from a constant container");
877 inline typename enable_if<is_fundamental<U>,
void>::T
878 assignRawStringToKey(U& key,
const std::string& x)
880 std::istringstream is(x); is>>key;
885 assignRawStringToKey(U& key,
const std::string& x)
887 throw std::runtime_error(
"key "+x+
" needs to be JSON encoded");
891 inline void assignRawStringToKey(std::string& key,
const std::string& x)
897 template <
class T,
class K>
905 auto iter=obj.emplace(k,
typename T::mapped_type()).first;
906 convert(iter->second,x);
910 template <
class T,
class K>
914 Not<is_pair<typename T::value_type>>
925 template <
class T,
class K>
926 typename enable_if<is_const<T>,
void>::T
927 assignElem(T& obj,
const K& k,
const REST_PROCESS_BUFFER& x) {}
935 typename T::value_type::second_type,
937 is_const<typename T::value_type::second_type>>::value
943 {
using type=
const typename T::value_type;};
948 makeElement(
const typename T::key_type& k) {
return {k,{}};}
951 makeElement(
const typename T::key_type& k) {
return k;}
964 typename std::remove_reference<
965 typename std::iterator_traits<I>::reference
967 typename std::iterator_traits<I>::value_type::second_type
970 elem_of(
const I& i)
const {
return i->second;}
975 const typename std::iterator_traits<I>::value_type&>
::T
976 elem_of(
const I& i)
const {
return *i;}
980 {
return elem_of(obj.emplace(makeElement<T>(k)).first);}
986 if (i==obj.end())
return dummyRef<typename MappedType<U>::type>();
991 {
return elemImpl<T>(k);}
995 RESTProcessAssociativeContainer(
T& obj): obj(obj) {}
996 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
997 std::vector<Signature>
signature()
const override;
999 std::string
type()
const override {
return typeName<T>();}
1000 REST_PROCESS_BUFFER asBuffer()
const override {REST_PROCESS_BUFFER r;
return r<<obj;}
1002 RPPtr
getElem(
const REST_PROCESS_BUFFER& index)
override {
1003 typename T::key_type
idx; index>>
idx;
1006 RPPtr
setElem(
const REST_PROCESS_BUFFER& index,
const REST_PROCESS_BUFFER& value)
override {
1007 typename T::key_type
idx; index>>
idx;
1012 size_t size()
const override {
return obj.size();}
1014 void erase(
const REST_PROCESS_BUFFER& index)
override {RPAC_erase(obj,index);}
1015 bool contains(
const REST_PROCESS_BUFFER& index)
const override {
1016 typename T::key_type k; convert(k,index);
1017 return obj.count(k);
1020 std::vector<typename T::key_type> k;
1022 k.emplace_back(
keyOf(i));
1023 return makeRESTProcessValueObject(std::move(k));
1027 template <
class T>
struct RESTProcessValueAssociativeContainer:
public RESTProcessAssociativeContainer<T>
1031 template <
class...
Args>
1032 RESTProcessValueAssociativeContainer(
Args&&... args):
1033 RESTProcessAssociativeContainer<T>(actual), actual(std::forward<Args>(args)...) {}
1044 typename enable_if<is_base_of<PolyRESTProcessBase, T>, RESTProcess_t>::T
1047 x.RESTProcess(r,
"");
1063 RESTProcessPtr(
T& ptr): ptr(ptr) {}
1064 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
1065 std::vector<Signature>
signature()
const override;
1072 std::string
type()
const override {
return typeName<T>();}
1074 if (!ptr || is_const<typename T::element_type>::value)
return nullptr;
1078 REST_PROCESS_BUFFER asBuffer()
const override {
1079 REST_PROCESS_BUFFER r;
1080 return ptr? (r<<*ptr): r;
1089 RESTProcessWeakPtr(
T& ptr): ptr(ptr) {}
1090 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
1091 std::vector<Signature>
signature()
const override;
1093 if (
auto p=ptr.lock())
1097 std::string
type()
const override {
return typeName<std::weak_ptr<T> >();}
1100 if (!p || is_const<typename T::element_type>::value)
return nullptr;
1103 const object* getConstClassdescObject()
override {
1107 REST_PROCESS_BUFFER asBuffer()
const override {
1108 REST_PROCESS_BUFFER r;
1110 return p? (r<<*p): r;
1117 struct RESTProcessPtr<
classdesc::weak_ptr<T>>:
public RESTProcessWeakPtr<classdesc::weak_ptr<T>>
1118 {RESTProcessPtr(classdesc::weak_ptr<T>& x): RESTProcessWeakPtr<classdesc::weak_ptr<T>>(x) {}};
1121 struct RESTProcessPtr<const
classdesc::weak_ptr<T>>:
public RESTProcessWeakPtr<const classdesc::weak_ptr<T>>
1122 {RESTProcessPtr(
const classdesc::weak_ptr<T>& x): RESTProcessWeakPtr<const classdesc::weak_ptr<T>>(x) {}};
1128 std::vector<REST_PROCESS_BUFFER> values;
1129 std::vector<REST_PROCESS_BUFFER>::iterator it;
1131 JSONBuffer(
const REST_PROCESS_BUFFER& j) {
1132 if (j.type()==RESTProcessType::array)
1133 for (
auto& i: j.array())
1134 values.push_back(REST_PROCESS_BUFFER(i));
1135 else if (j.type()!=RESTProcessType::null)
1136 values.push_back(j);
1139 JSONBuffer(
const JSONBuffer& x): values(x.values), it(values.begin()+(x.it-x.values.begin())) {}
1140 JSONBuffer& operator=(
const JSONBuffer& x) {
1142 it=values.begin()+(x.it-x.values.begin());
1146 JSONBuffer& operator>>(
T& x) {
1147 if (it<values.end()) (*it++) >> x;
1151 JSONBuffer& operator>>(
const T& x) {
1152 if (it<values.end()) ++it;
1160 is_reference<typename functional::Return<F>::T>>,
1162 callFunction(
const string& remainder,
const REST_PROCESS_BUFFER& arguments, F f)
1165 auto& r=functional::callOnBuffer(argBuf,f);
1166 if (remainder.empty())
1170 switch (arguments.type())
1172 case RESTProcessType::null:
break;
1173 case RESTProcessType::array:
1175 auto arr=arguments.array();
1181 if (functional::Arity<F>::value==0)
1182 convert(r,arguments);
1185 return std::make_shared<RESTProcessObject<typename functional::Return<F>::T>>(r);
1189 return map.process(remainder, arguments);
1199 callFunction(
const string& remainder,
const REST_PROCESS_BUFFER& arguments, F f)
1202 auto r=functional::callOnBuffer(argBuf,f);
1203 if (remainder.empty())
1204 return makeRESTProcessValueObject(std::move(r));
1207 return map.process(remainder, arguments);
1213 is_void<typename functional::Return<F>::T>>,
1215 callFunction(
const string& remainder,
const REST_PROCESS_BUFFER& arguments, F f)
1218 functional::callOnBuffer(argBuf,f);
1219 return std::make_shared<RESTProcessVoid>();
1226 callFunction(
const string& remainder,
const REST_PROCESS_BUFFER& arguments, F f)
1227 {
throw std::runtime_error(
"cannot call this function");}
1232 template <
class T,
class V>
1237 template <
class T,
class V>
1238 typename enable_if<is_same<T,bool>,
bool>::T
1240 {
return x.type()==RESTProcessType::boolean;}
1244 {
return x.type()==RESTProcessType::string;}
1248 matches(
const REST_PROCESS_BUFFER& x)
1249 {
return x.type()==RESTProcessType::string;}
1253 {
return x.type()==RESTProcessType::int_number;}
1257 {
return x.type()==RESTProcessType::float_number;}
1261 {
return x.type()==RESTProcessType::string;}
1272 matches(
const REST_PROCESS_BUFFER& x)
1274 if (x.type()!=RESTProcessType::object)
return false;
1278 REST_PROCESS_BUFFER(x)>>test;
1280 catch(
const std::exception&)
1288 if (x.type()==RESTProcessType::array)
1300 using type=
typename remove_const<typename remove_reference<T>::type>::type;
1305 matches(
const REST_PROCESS_BUFFER&) {
return false;}
1309 And<is_const<typename remove_reference<T>::type>, is_reference<T>>,
bool>::T
1310 matches(
const REST_PROCESS_BUFFER& x)
1311 {
return matches<typename remove_const_ref<T>::type>(x);}
1321 matches(
const REST_PROCESS_BUFFER& x)
1327 static const bool value = !is_integral<T>::value && !is_floating_point<T>::value &&
1328 !is_container<T>::value && !is_object<T>::value && !is_pointer<T>::value;
1333 matches(
const REST_PROCESS_BUFFER&) {
return false;}
1336 typename enable_if<And<is_reference<T>, Not<is_const<typename remove_reference<T>::type>>>,
bool>::T
1337 matches(
const REST_PROCESS_BUFFER&) {
return false;}
1344 {
return x.type()==RESTProcessType::float_number||x.type()==RESTProcessType::int_number||x.type()==RESTProcessType::null;}
1348 And<is_const<typename remove_reference<T>::type>, is_reference<T>>,
bool>::T
1354 Not<is_floating_point<T>>,
1355 Not<is_container<T>>,
1356 Not<And<is_reference<T>,is_const<typename remove_reference<T>::type>>>
1361 typename enable_if<is_container<T>,
bool>::T
partiallyMatchable(
const REST_PROCESS_BUFFER& x)
1363 if (x.type()==RESTProcessType::array)
1389 template <
class T>
unsigned argMatchScore(
const REST_PROCESS_BUFFER& x)
1393 return RESTProcessFunctionBase::maxMatchScore;
1397 template <
class F,
int N,
int NN=N>
1400 static unsigned score(
const REST_PROCESS_BUFFER& x)
1402 if (x.type()!=RESTProcessType::array)
return RESTProcessFunctionBase::maxMatchScore;
1404 if (arr.size()<N)
return RESTProcessFunctionBase::maxMatchScore;
1405 return argMatchScore<typename functional::Arg<F,N>::T>(REST_PROCESS_BUFFER(arr[N-1])) +
1406 MatchScore<F,N-1,NN>::score(x);
1410 template <
class F,
int NN>
1413 static unsigned score(
const REST_PROCESS_BUFFER& x)
1415 if (x.type()!=RESTProcessType::array)
return RESTProcessFunctionBase::maxMatchScore;
1417 if (arr.size()<2)
return RESTProcessFunctionBase::maxMatchScore;
1418 return argMatchScore<typename functional::Arg<F,1>::T>(REST_PROCESS_BUFFER(arr[0])) +
1424 template <
class F,
int NN>
1427 static unsigned score(
const REST_PROCESS_BUFFER& x)
1431 case RESTProcessType::null:
1432 return RESTProcessFunctionBase::maxMatchScore;
1433 case RESTProcessType::array:
1436 if (arr.empty())
return RESTProcessFunctionBase::maxMatchScore;
1437 return argMatchScore<typename functional::Arg<F,1>::T>(REST_PROCESS_BUFFER(arr[0]))+
1441 return argMatchScore<typename functional::Arg<F,1>::T>(x);
1446 template <
class F,
int NN>
1449 static unsigned score(
const REST_PROCESS_BUFFER& x)
1453 case RESTProcessType::null:
1455 case RESTProcessType::array:
1458 return 10*arr.size()-NN;
1466 template <class F, int N=functional::Arity<F>::value>
1467 unsigned matchScore(
const REST_PROCESS_BUFFER& x)
1468 {
return MatchScore<F,N>::score(x);}
1473 template <
class O,
class M,
class R>
1478 template <class F, class R=typename functional::Return<F>::T>
1483 RESTProcessFunction(F f): f(f) {}
1486 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override
1487 {
return callFunction(remainder, arguments, f);}
1491 unsigned matchScore(
const REST_PROCESS_BUFFER& arguments)
const override
1492 {
return classdesc::matchScore<F>(arguments);}
1497 is_default_constructible<typename remove_reference<U>::type>,
1501 typename remove_const<typename remove_reference<U>::type>
::type x;
1509 is_default_constructible<typename remove_reference<U>::type>,
1511 >>,RESTProcess_t>::T
1512 slist()
const {
return {};}
1515 std::string
type()
const override {
return typeName<R>();}
1517 bool isConst()
const override {
return FunctionalIsConst<F>::value;}
1521 template <
class F,
class R>
1526 RESTProcessFunction(F f): f(f) {}
1527 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override
1529 throw std::runtime_error(
"currently unable to call functions returning unique_ptr");
1533 unsigned matchScore(
const REST_PROCESS_BUFFER& arguments)
const override
1534 {
return classdesc::matchScore<F>(arguments);}
1536 std::string
type()
const override {
return typeName<F>();}
1539 template <
class T,
class F>
1540 typename enable_if<functional::is_member_function_ptr<F>,
void>::T
1541 RESTProcess(RESTProcess_t& repo,
const string& d, T& obj, F f)
1543 auto bm=functional::bindMethod(obj,f);
1544 repo.add(d,
new RESTProcessFunction<
decltype(bm)>(bm));
1545 repo.defineFunctionArgTypes<F>();
1553 repo.defineFunctionArgTypes<F>();
1556 template <
class F> std::shared_ptr<RESTProcessFunction<F>>
1557 makeRESTProcessFunction(F f)
1558 {
return std::make_shared<RESTProcessFunction<F>>(f);}
1568 RESTProcessEnum(E& e): e(e) {}
1569 RPPtr
process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override
1571 if (remainder==
"@type")
1572 return makeRESTProcessValueObject(typeName<E>());
1573 else if (remainder==
"@signature")
1574 return makeRESTProcessValueObject(
signature());
1575 else if (arguments.type()==RESTProcessType::string)
1577 string tmp; arguments>>tmp;
1578 convert(e, enum_keys<E>()(tmp));
1580 else if (arguments.type()==RESTProcessType::array && !arguments.array().empty())
1582 string tmp;
json_pack_t(arguments.array()[0])>>tmp;
1583 convert(e, enum_keys<E>()(tmp));
1585 return makeRESTProcessValueObject(enum_keys<E>()(e));
1587 std::vector<Signature>
signature()
const override;
1589 std::string
type()
const override {
return typeName<E>();}
1590 REST_PROCESS_BUFFER asBuffer()
const override {
return REST_PROCESS_BUFFER(enum_keys<E>()(e));}
1596 RPPtr process(
const string& remainder,
const REST_PROCESS_BUFFER& arguments)
override;
1597 std::vector<Signature> signature()
const override;
1599 std::string type()
const override {
return "function";}
1600 REST_PROCESS_BUFFER asBuffer()
const override {
return {};}
1610 typename enable_if<Not<is_enum<T>>,
void>::T
1620 DefineFunctionArgTypes<F,N-1>::define(r);
1641 void RESTProcess_onbase(RESTProcess_t& r,
const string& d, T& a)
1644 template <
class T,
class F>
1655 template <
class T,
class...
Args>
1656 struct RESTProcessMultiArrayFromC:
public RESTProcessMultiArray<MultiArray<T,NumArgs<Args...>::value>>
1659 RESTProcessMultiArrayFromC(
T* data,
Args... dims):
1660 RESTProcessMultiArray<MultiArray<T,rank>>(data,dims...) {}
1663 template <
class T,
class...
Args>
1670 void RESTProcess(RESTProcess_t& r,
const string& d, is_constructor, T& a) {}
1677 template <
class T>
struct RESTProcessHeapObject:
public RESTProcessPtr<std::unique_ptr<T>>
1679 std::unique_ptr<T> obj;
1680 RESTProcessHeapObject(): RESTProcessPtr<std::unique_ptr<T>>(obj) {}
1681 RESTProcessHeapObject(std::unique_ptr<T>&& o): RESTProcessPtr<std::unique_ptr<T>>(obj), obj(std::move(o)) {}
1685 template <
class T> std::shared_ptr<RESTProcessHeapObject<T>>
1686 makeRESTProcessHeapObject(std::unique_ptr<T>&& obj)
1687 {
return std::make_shared<RESTProcessHeapObject<T>>(std::move(obj));}
1698 template <
class T,
size_t N>
1703#include "use_mbr_pointers.h"
1704CLASSDESC_USE_OLDSTYLE_MEMBER_OBJECTS(RESTProcess);
1707using classdesc::RESTProcess_onbase;
Definition RESTProcess_base.h:1595
Definition RESTProcess_base.h:1127
Definition multiArray.h:25
Definition RESTProcess_base.h:954
RPPtr setElem(const REST_PROCESS_BUFFER &index, const REST_PROCESS_BUFFER &value) override
Definition RESTProcess_base.h:1006
RPPtr keys() const override
returns a list of keys if this is an associative container, otherwise void
Definition RESTProcess_base.h:1019
bool contains(const REST_PROCESS_BUFFER &index) const override
returns true if an associative container contains key
Definition RESTProcess_base.h:1015
std::string type() const override
return type name of this
Definition RESTProcess_base.h:999
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:309
void insert(const REST_PROCESS_BUFFER &value) override
append to end of a sequence, or inserts key into an associative container
Definition RESTProcess_base.h:1013
RPPtr getElem(const REST_PROCESS_BUFFER &index) override
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:1002
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_epilogue.h:141
size_t size() const override
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:1012
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:87
void erase(const REST_PROCESS_BUFFER &index) override
erase an element - by position for sequences, by key for associative containers
Definition RESTProcess_base.h:1014
bool isObject() const override
Definition RESTProcess_base.h:1001
interface for the REST processor
Definition RESTProcess_base.h:42
virtual RPPtr keys() const
returns a list of keys if this is an associative container, otherwise void
Definition RESTProcess_base.h:555
virtual void erase(const REST_PROCESS_BUFFER &index)
erase an element - by position for sequences, by key for associative containers
Definition RESTProcess_base.h:88
virtual RPPtr setElem(const REST_PROCESS_BUFFER &index, const REST_PROCESS_BUFFER &value)
Definition RESTProcess_base.h:83
T * getObject()
returns a pointer to the underlying object if it is one of type T, otherwise null
Definition RESTProcess_base.h:558
virtual RESTProcess_t list() const =0
return list of subcommands to this
virtual bool isObject() const
Definition RESTProcess_base.h:72
enable_if< is_base_of< object, T >, constobject * >::T getClassdescObjectImpl(T &obj)
implementation of upcasting to a classdesc::object
Definition RESTProcess_base.h:46
virtual bool contains(const REST_PROCESS_BUFFER &key) const
returns true if an associative container contains key
Definition RESTProcess_base.h:90
virtual unsigned arity() const
arity if this is a function, 0 otherwise
Definition RESTProcess_base.h:76
virtual object * getClassdescObject()
returns a classdesc object if referring to an object derived from classdesc::object
Definition RESTProcess_base.h:68
virtual size_t size() const
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:78
virtual void insert(const REST_PROCESS_BUFFER &value)
append to end of a sequence, or inserts key into an associative container
Definition RESTProcess_base.h:86
Signature functionSignature() const
return signature for a function type F
Definition RESTProcess_epilogue.h:169
virtual RPPtr process(const string &path, const REST_PROCESS_BUFFER &arguments)=0
virtual std::vector< Signature > signature() const =0
return signature(s) of the operations
virtual bool isConst() const
true if this is a const object, a const member function or static/free function
Definition RESTProcess_base.h:74
virtual std::string type() const =0
return type name of this
virtual RPPtr getElem(const REST_PROCESS_BUFFER &)
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:552
virtual void populate(RESTProcess_t &map) const
populate map from the object wrapped by this, if any
Definition RESTProcess_base.h:62
Definition RESTProcess_base.h:1565
std::string type() const override
return type name of this
Definition RESTProcess_base.h:1589
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_base.h:1569
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:1588
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:94
Definition RESTProcess_base.h:126
virtual unsigned matchScore(const REST_PROCESS_BUFFER &arguments) const =0
returns how good the match is with arguments, less is best
std::string type() const override
return type name of this
Definition RESTProcess_base.h:1536
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_base.h:1527
unsigned matchScore(const REST_PROCESS_BUFFER &arguments) const override
returns how good the match is with arguments, less is best
Definition RESTProcess_base.h:1533
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:1535
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_base.h:1531
Definition RESTProcess_base.h:1480
std::string type() const override
return type name of this
Definition RESTProcess_base.h:1515
unsigned arity() const override
arity if this is a function, 0 otherwise
Definition RESTProcess_base.h:1518
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_base.h:1486
unsigned matchScore(const REST_PROCESS_BUFFER &arguments) const override
returns how good the match is with arguments, less is best
Definition RESTProcess_base.h:1491
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:1514
bool isConst() const override
true if this is a const object, a const member function or static/free function
Definition RESTProcess_base.h:1517
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_base.h:1489
bool isObject() const override
Definition RESTProcess_base.h:1516
RPPtr setElem(const REST_PROCESS_BUFFER &index, const REST_PROCESS_BUFFER &value) override
Definition RESTProcess_base.h:728
std::string type() const override
return type name of this
Definition RESTProcess_base.h:721
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:272
void insert(const REST_PROCESS_BUFFER &value) override
append to end of a sequence, or inserts key into an associative container
Definition RESTProcess_base.h:735
RPPtr getElem(const REST_PROCESS_BUFFER &index) override
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:724
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_epilogue.h:130
size_t size() const override
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:734
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:80
void erase(const REST_PROCESS_BUFFER &index) override
erase an element - by position for sequences, by key for associative containers
Definition RESTProcess_base.h:736
bool isObject() const override
Definition RESTProcess_base.h:723
marker for containers and pointers that wrap
Definition RESTProcess_base.h:122
Definition classdesc.h:920
Definition classdesc.h:923
Definition classdesc.h:926
Definition json_pack_base.h:99
Metaprogramming support for processing functions of multiple arguments.
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
const T & keyOf(const T &x)
utility key extraction function for associative containers
Definition classdesc.h:526
std::string idx(const std::string &prefix, size_t i)
utility for generating index keys (for use with arrays)
Definition xml_common.h:14
enable_if< is_enum< E >, void >::T defineType(RESTProcess_t &r)
define type dependent information in repository
Definition RESTProcess_base.h:1606
enable_if< And< Not< is_const< T > >, is_pair< typenameT::value_type > >, void >::T assignElem(T &obj, const K &k, const REST_PROCESS_BUFFER &x)
assign x if T is a map
Definition RESTProcess_base.h:903
enable_if< And< Not< is_container< T > >, Not< is_smart_ptr< T > > >, RPPtr >::T makeRESTProcessRef(T &obj)
create an appropriate RESTProcess object referring to the argument.
Definition RESTProcess_epilogue.h:551
enable_if< is_floating_point< T >, bool >::T partiallyMatchable(const REST_PROCESS_BUFFER &x)
testing for not quite so good matches between json type and C++ type
Definition RESTProcess_base.h:1343
void RPAC_insert(T &obj, const REST_PROCESS_BUFFER &arguments)
insert element into an associative container
Definition RESTProcess_base.h:846
enable_if< And< is_pointer< T >, Not< is_same< T, constchar * > > >, bool >::T matches(const V &x)
Definition RESTProcess_base.h:1234
enable_if< Not< functional::is_nonmember_function_ptr< T > >, void >::T RESTProcess(RESTProcess_t &, const std::string &, T &)
descriptor for generating building REST processing registry
Definition RESTProcess_epilogue.h:177
Definition classdesc.h:420
Definition RESTProcess_epilogue.h:159
Definition RESTProcess_base.h:1616
Definition RESTProcess_base.h:1471
Definition RESTProcess_base.h:929
Definition RESTProcess_base.h:1399
Definition multiArray.h:94
used for removing const attributes of an associative container's value_type
Definition RESTProcess_base.h:834
Definition classdesc.h:405
Definition RESTProcess_base.h:1650
Definition classdesc.h:423
bool isObject() const override
Definition RESTProcess_base.h:1682
Definition RESTProcess_base.h:1657
RPPtr setElem(const REST_PROCESS_BUFFER &index, const REST_PROCESS_BUFFER &value)
Definition RESTProcess_base.h:806
RPPtr getElem(const REST_PROCESS_BUFFER &index)
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:802
size_t size() const override
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:812
RPPtr setElem(const REST_PROCESS_BUFFER &index, const REST_PROCESS_BUFFER &value) override
Definition RESTProcess_base.h:777
std::string type() const override
return type name of this
Definition RESTProcess_base.h:769
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:293
RPPtr getElem(const REST_PROCESS_BUFFER &index) override
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:771
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:768
size_t size() const override
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:787
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_base.h:767
bool isObject() const override
Definition RESTProcess_base.h:770
handle setting and getting of objects
Definition RESTProcess_base.h:449
void populate(RESTProcess_t &map) const override
populate map from the object wrapped by this, if any
Definition RESTProcess_base.h:477
std::string type() const override
return type name of this
Definition RESTProcess_epilogue.h:154
std::shared_ptr< classdesc::RESTProcessBase > process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_base.h:452
object * getClassdescObject() override
returns a classdesc object if referring to an object derived from classdesc::object
Definition RESTProcess_base.h:478
RPPtr getElem(const REST_PROCESS_BUFFER &b) override
get element by position for sequences, by key for associative containers
Definition RESTProcess_base.h:491
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_epilogue.h:124
bool isConst() const override
true if this is a const object, a const member function or static/free function
Definition RESTProcess_base.h:484
RPPtr setElem(const REST_PROCESS_BUFFER &b, const REST_PROCESS_BUFFER &value) override
Definition RESTProcess_base.h:502
size_t size() const override
size if this is a container, 0 otherwise
Definition RESTProcess_base.h:485
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:59
bool isObject() const override
Definition RESTProcess_base.h:482
Definition RESTProcess_base.h:138
std::string type() const override
return type name of this
Definition RESTProcess_base.h:151
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:187
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_epilogue.h:127
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_base.h:142
Definition RESTProcess_base.h:1061
std::string type() const override
return type name of this
Definition RESTProcess_base.h:1072
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:382
object * getClassdescObject() override
returns a classdesc object if referring to an object derived from classdesc::object
Definition RESTProcess_base.h:1073
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:1066
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:66
bool isObject() const override
Definition RESTProcess_base.h:1082
Definition RESTProcess_base.h:743
class that represents the void, or null object
Definition RESTProcess_base.h:542
std::string type() const override
return type name of this
Definition RESTProcess_base.h:548
std::shared_ptr< RESTProcessBase > process(const string &, const REST_PROCESS_BUFFER &) override
Definition RESTProcess_base.h:543
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:547
bool isConst() const override
true if this is a const object, a const member function or static/free function
Definition RESTProcess_base.h:549
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_base.h:546
std::string type() const override
return type name of this
Definition RESTProcess_base.h:1097
RPPtr process(const string &remainder, const REST_PROCESS_BUFFER &arguments) override
Definition RESTProcess_epilogue.h:401
object * getClassdescObject() override
returns a classdesc object if referring to an object derived from classdesc::object
Definition RESTProcess_base.h:1098
RESTProcess_t list() const override
return list of subcommands to this
Definition RESTProcess_base.h:1092
std::vector< Signature > signature() const override
return signature(s) of the operations
Definition RESTProcess_epilogue.h:73
bool isObject() const override
Definition RESTProcess_base.h:1112
REST processor registry.
Definition RESTProcess_base.h:351
void add(string d, RESTProcessFunctionBase *rp)
ownership of rp is passed
Definition RESTProcess_base.h:367
void defineFunctionArgTypes()
define all arguments of F
Definition RESTProcess_base.h:403
void addFactory(const std::string &typeName, const std::function< void(const std::string &objName)> &callback=nullptr)
Definition RESTProcess_epilogue.h:533
RESTProcess_t(const RPPtr &p)
Construct from an object that RPPPtr wraps.
Definition RESTProcess_base.h:358
void add(string d, RESTProcessBase *rp)
ownership of rp is passed
Definition RESTProcess_base.h:360
Definition signature.h:18
Definition classdesc.h:299
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
Arity::V (or ::value) is the number of arguments of
Definition function.h:43
Definition classdesc.h:505
Definition classdesc.h:490
Definition RESTProcess_base.h:1326
Definition RESTProcess_base.h:574
true_type if T is a std::pair
Definition classdesc.h:367
determines if T is a standard sequence container
Definition classdesc.h:302
Definition RESTProcess_base.h:1299
transfer the constness property of T to U
Definition classdesc.h:431
Definition RESTProcess_base.h:1693