prologparse.hh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. #ifndef PROLOGPARSE_HH
  2. #define PROLOGPARSE_HH
  3. #include <gprolog.h>
  4. #include <string>
  5. #include <iostream>
  6. #include <tuple>
  7. #include <vector>
  8. #include <typeinfo>
  9. #include <cstddef>
  10. //template<class Value, class ...Values>
  11. class prologparse{
  12. private:
  13. std::vector<PlTerm> gEvents;
  14. //unsigned int cpt=0;
  15. //template<typename Value>
  16. // template<typename Value>
  17. // void unstack(Value element){
  18. // if(typeid(element)==typeid(int)){
  19. // variadic_types.push_back("int");
  20. // }else{
  21. // if(typeid(element)==typeid(const char*)){
  22. // variadic_types.push_back("string");
  23. // }
  24. // }
  25. // //std::cout<<element<<" "<<typeid(element).name()<<std::endl;
  26. // }
  27. void unstack(int element){
  28. gEvents.push_back(Mk_Integer(element));
  29. }
  30. void unstack(const char* element){
  31. gEvents.push_back(Mk_String(element));
  32. }
  33. void unstack(std::string element){
  34. gEvents.push_back(Mk_String(const_cast<char*>(element.c_str())));
  35. }
  36. void unstack(float element){
  37. gEvents.push_back(Mk_Float(element));
  38. }
  39. template<typename ...Values>
  40. void unstack(int element,Values... elements){
  41. gEvents.push_back(Mk_Integer(element));
  42. unstack(elements...);
  43. }
  44. template<typename ...Values>
  45. void unstack(const char* element,Values... elements){
  46. gEvents.push_back(Mk_String(element));
  47. unstack(elements...);
  48. }
  49. template<typename ...Values>
  50. void unstack(std::string element,Values... elements){
  51. gEvents.push_back(Mk_String(const_cast<char*>(element.c_str())));
  52. unstack(elements...);
  53. }
  54. template<typename ...Values>
  55. void unstack(float element,Values... elements){
  56. gEvents.push_back(Mk_Float(element));
  57. unstack(elements...);
  58. }
  59. public:
  60. /** \brief Void constructor
  61. *
  62. * add desc
  63. *
  64. */
  65. prologparse(){
  66. std::cout<<"lol"<<std::endl;
  67. //
  68. // int stt=Start_Prolog(1, new char*());
  69. // std::cout<<stt<<std::endl;
  70. //Try_Execute_Top_Level();
  71. }
  72. void resetPl(){
  73. Pl_Reset_Prolog ();
  74. }
  75. int startPl(){
  76. return Start_Prolog(1, new char*());
  77. }
  78. void stopPl(){Stop_Prolog();}
  79. // /** \brief Destructor
  80. // *
  81. // * add desc
  82. // *
  83. // */
  84. ~prologparse(){
  85. //Stop_Prolog();
  86. }
  87. // PlTerm to_gEvent(std::string type_, std::string location_, unsigned long begin_, unsigned long end_);
  88. //bool intersect(int au,)
  89. int rule(std::string name){
  90. Pl_Reset_Prolog ();
  91. PlTerm plt[1];
  92. int func;
  93. int gRes=-1;
  94. func = Find_Atom(const_cast<char*>(name.c_str()));
  95. Pl_Query_Begin(PL_FALSE);
  96. std::cout<<func<<std::endl;
  97. gRes = Pl_Query_Call(func, 1, plt);
  98. Pl_Query_End(PL_KEEP_FOR_PROLOG);
  99. if(gRes==1){
  100. std::cout<<"true"<<std::endl;
  101. }
  102. gEvents.clear();
  103. return gRes;
  104. //std::cout<<gRes << " "<<true<<std::endl;
  105. }
  106. template<typename Value,typename... Values>
  107. int rule(std::string name,Value val,Values... vals){
  108. Pl_Reset_Prolog ();
  109. unstack(val,vals...);
  110. std::tuple<Value,Values...> tupl(val,vals...);
  111. //gEvents.push_back(Mk_Variable());
  112. PlTerm* plt=&gEvents[0];
  113. std::cout<<gEvents.size()<<std::endl;
  114. int func;
  115. int result=-1;
  116. func = Find_Atom(const_cast<char*>(name.c_str()));
  117. std::cout<<func<<" "<<Rd_Float(plt[0])<<std::endl;
  118. //plt[0]=1;plt[1]=1;plt[2]=1;plt[3]=1;plt[4]=1;plt[5]=1;plt[6]=1;
  119. Pl_Query_Begin(PL_FALSE);
  120. result=Pl_Query_Call(func, gEvents.size(), plt);
  121. Pl_Query_End(PL_KEEP_FOR_PROLOG);
  122. if(result==1){
  123. std::cout<<"true"<<std::endl;
  124. }else{
  125. if(result==0){
  126. std::cout<<"false"<<std::endl;
  127. }
  128. }
  129. gEvents.clear();
  130. return result;
  131. }
  132. template<typename Value>
  133. void process_one_type(){
  134. std::cout<<typeid(Value).name()<<" ";
  135. }
  136. template <typename... Values>
  137. void unpack(){
  138. int _[]={0,(process_one_type<Values>(),0)...};
  139. (void)_;
  140. std::cout<<std::endl;
  141. }
  142. };
  143. #endif // PROLOGPARSE_HH