1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
/***************************************** The Meta Behavior Tree Library Copyright (c) 2017 David Feng Distributed under the MIT License. *****************************************/ #ifndef META_TRAVERSAL_HPP #define META_TRAVERSAL_HPP #include "metafunctions.hpp" #include "common_nodes.hpp" namespace mbt { template<class REST, class FOUNDITR, class ENDITR> struct getResultvec { typedef typename ::boost::mpl::erase< REST , FOUNDITR , ENDITR >::type tmp; typedef typename eval_if_compare< FOUNDITR , ENDITR , tmp , typename ::boost::mpl::insert< tmp , typename ::boost::mpl::end<tmp>::type , typename ::boost::mpl::deref<FOUNDITR>::type >::type >::type type; }; template<class FOUNDITR, class ENDITR> struct getNextHead { typedef typename eval_if_compare< FOUNDITR , ENDITR , null_node , typename ::boost::mpl::deref<FOUNDITR>::type >::type type; }; template<class ROW> struct getEndItr { typedef typename ::boost::mpl::end<ROW>::type type; }; template<class ROW> struct getBeginItr { typedef typename ::boost::mpl::begin<ROW>::type type; }; template<class ROW> struct getFront { typedef typename ::boost::mpl::deref<typename getBeginItr<ROW>::type >::type type; }; template<class ROW> struct getBack { typedef typename ::boost::mpl::deref<typename getEndItr<ROW>::type >::type type; }; struct _find_if_composite_functor { template<class NODE> struct apply { typedef typename ::boost::mpl::front<typename NODE::node_type_tag>::type tag; typedef ::boost::is_same< tag , composite_node_tag > type; }; }; template<class REST> struct getNextHeadItr { typedef typename ::boost::mpl::find_if<REST , _find_if_composite_functor >::type type; }; template<class REST, class BEGINITR, class FOUNDITR, class ENDITR> struct getStack { typedef typename eval_if_compare< FOUNDITR , ENDITR , ::boost::mpl::vector0<> ,typename erase_range_and_end<REST, BEGINITR, FOUNDITR>::type >::type type; }; template<class ROW> struct removeHead { typedef typename ::boost::mpl::begin<ROW>::type begin_itr; typedef typename ::boost::mpl::deref<begin_itr>::type front; typedef typename ::boost::mpl::remove<ROW, front>::type type; //typedef typename ::boost::mpl::pop_front<ROW>::type type; }; template<class TARGETNODE> struct _getRow_functor { template<class ACCUVEC, class ROW> struct apply { typedef typename ::boost::mpl::front<ROW>::type head; typedef typename eval_if_compare< TARGETNODE , head , typename copy_vector<ACCUVEC, ROW>::type , ACCUVEC >::type type; }; }; template<class COMPOSITE, class TABLE> struct getRow { typedef typename ::boost::mpl::fold< TABLE , ::boost::mpl::vector0<> , _getRow_functor<COMPOSITE> >::type type; }; } #endif |
Copyright © 2016-2020 Qualgame, LLC