|
| 1 | +#ifndef GREETER_TEST_H_ |
| 2 | +#define GREETER_TEST_H_ |
| 3 | + |
| 4 | +#include <behaviortree_cpp/utils/safe_any.hpp> |
| 5 | + |
| 6 | +/** |
| 7 | + * +-------------------+------------+-------------+-----------------------------+ |
| 8 | + * | Class | Base Class | Polymorphic | Type Trait Registered | |
| 9 | + * +-------------------+------------+-------------+-----------------------------+ |
| 10 | + * | Greeter | - | Yes | Greeter | |
| 11 | + * | HelloGreeter | Greeter | Yes | Greeter | |
| 12 | + * | FancyHelloGreeter | Greeter | Yes | Greeter | |
| 13 | + * | Unwelcomer | - | Yes | Greeter (Purposely invalid) | |
| 14 | + * +-------------------+------------+-------------+-----------------------------+ |
| 15 | + */ |
| 16 | + |
| 17 | +class Greeter |
| 18 | +{ |
| 19 | +public: |
| 20 | + using Ptr = std::shared_ptr<Greeter>; |
| 21 | + virtual ~Greeter() = default; |
| 22 | + virtual std::string show_msg() const |
| 23 | + { |
| 24 | + return ""; |
| 25 | + }; |
| 26 | +}; |
| 27 | + |
| 28 | +class HelloGreeter : public Greeter |
| 29 | +{ |
| 30 | +public: |
| 31 | + using Ptr = std::shared_ptr<HelloGreeter>; |
| 32 | + std::string show_msg() const override |
| 33 | + { |
| 34 | + return "hello"; |
| 35 | + } |
| 36 | + void setDerivedParameter(int n){}; |
| 37 | +}; |
| 38 | + |
| 39 | +class FancyHelloGreeter : public HelloGreeter |
| 40 | +{ |
| 41 | +public: |
| 42 | + using Ptr = std::shared_ptr<FancyHelloGreeter>; |
| 43 | + std::string show_msg() const override |
| 44 | + { |
| 45 | + return "salutations"; |
| 46 | + } |
| 47 | +}; |
| 48 | + |
| 49 | +class Unwelcomer |
| 50 | +{ |
| 51 | +public: |
| 52 | + using Ptr = std::shared_ptr<Unwelcomer>; |
| 53 | + virtual ~Unwelcomer() = default; |
| 54 | + virtual std::string show_msg() const |
| 55 | + { |
| 56 | + return "You’re not welcome here"; |
| 57 | + }; |
| 58 | +}; |
| 59 | + |
| 60 | +// Register cast base type for self to allow direct cast |
| 61 | +template <> |
| 62 | +struct BT::any_cast_base<Greeter> |
| 63 | +{ |
| 64 | + using type = Greeter; |
| 65 | +}; |
| 66 | + |
| 67 | +// Register cast base type for HelloGreeter |
| 68 | +template <> |
| 69 | +struct BT::any_cast_base<HelloGreeter> |
| 70 | +{ |
| 71 | + using type = Greeter; |
| 72 | +}; |
| 73 | + |
| 74 | +// Register cast base type for FancyHelloGreeter |
| 75 | +template <> |
| 76 | +struct BT::any_cast_base<FancyHelloGreeter> |
| 77 | +{ |
| 78 | + using type = Greeter; |
| 79 | +}; |
| 80 | + |
| 81 | +// Register cast base type for Unwelcomer |
| 82 | +// WARNING: intentionally incorrect |
| 83 | +template <> |
| 84 | +struct BT::any_cast_base<Unwelcomer> |
| 85 | +{ |
| 86 | + using type = Greeter; |
| 87 | +}; |
| 88 | + |
| 89 | +/** |
| 90 | +* +-------------------+--------------+-------------+-----------------------+ |
| 91 | +* | Class | Base Class | Polymorphic | Type Trait Registered | |
| 92 | +* +-------------------+--------------+-------------+-----------------------+ |
| 93 | +* | GreeterNoReg | - | Yes | - | |
| 94 | +* | HelloGreeterNoReg | GreeterNoReg | Yes | - | |
| 95 | +* +-------------------+--------------+-------------+-----------------------+ |
| 96 | +*/ |
| 97 | + |
| 98 | +class GreeterNoReg |
| 99 | +{ |
| 100 | +public: |
| 101 | + using Ptr = std::shared_ptr<GreeterNoReg>; |
| 102 | + virtual ~GreeterNoReg() = default; |
| 103 | + virtual std::string show_msg() const |
| 104 | + { |
| 105 | + return ""; |
| 106 | + }; |
| 107 | +}; |
| 108 | + |
| 109 | +class HelloGreeterNoReg : public GreeterNoReg |
| 110 | +{ |
| 111 | +public: |
| 112 | + using Ptr = std::shared_ptr<HelloGreeterNoReg>; |
| 113 | + std::string show_msg() const override |
| 114 | + { |
| 115 | + return "hello"; |
| 116 | + } |
| 117 | + void setDerivedParameter(int n){}; |
| 118 | +}; |
| 119 | + |
| 120 | +/** |
| 121 | +* +--------------------+---------------+-------------+-----------------------+ |
| 122 | +* | Class | Base Class | Polymorphic | Type Trait Registered | |
| 123 | +* +--------------------+---------------+-------------+-----------------------+ |
| 124 | +* | GreeterNoPoly | - | No | GreeterNoPoly | |
| 125 | +* | HelloGreeterNoPoly | GreeterNoPoly | No | GreeterNoPoly | |
| 126 | +* +-----------------------+------------+-------------+-----------------------+ |
| 127 | +*/ |
| 128 | + |
| 129 | +// Correctly fails to compile: |
| 130 | +// static_assert(std::is_polymorphic_v<Base>, "Base must be polymorphic"); |
| 131 | + |
| 132 | +// class GreeterNoPoly |
| 133 | +// { |
| 134 | +// public: |
| 135 | +// using Ptr = std::shared_ptr<GreeterNoPoly>; |
| 136 | +// std::string greet() const |
| 137 | +// { |
| 138 | +// return ""; |
| 139 | +// }; |
| 140 | +// }; |
| 141 | +// |
| 142 | +// class HelloGreeterNoPoly : public GreeterNoPoly |
| 143 | +// { |
| 144 | +// public: |
| 145 | +// using Ptr = std::shared_ptr<HelloGreeterNoPoly>; |
| 146 | +// std::string hello_greet() |
| 147 | +// { |
| 148 | +// return "hello" + greet(); |
| 149 | +// } |
| 150 | +// }; |
| 151 | +// |
| 152 | +// // Register cast base type for self to allow direct cast |
| 153 | +// template <> |
| 154 | +// struct BT::any_cast_base<GreeterNoPoly> |
| 155 | +// { |
| 156 | +// using type = GreeterNoPoly; |
| 157 | +// }; |
| 158 | +// |
| 159 | +// // Register cast base type for HelloGreeter |
| 160 | +// template <> |
| 161 | +// struct BT::any_cast_base<HelloGreeterNoPoly> |
| 162 | +// { |
| 163 | +// using type = GreeterNoPoly; |
| 164 | +// }; |
| 165 | + |
| 166 | +/** |
| 167 | +* +-----------------------+------------+-------------+-----------------------+ |
| 168 | +* | Class | Base Class | Polymorphic | Type Trait Registered | |
| 169 | +* +-----------------------+------------+-------------+-----------------------+ |
| 170 | +* | GreeterNoPolyReg | - | No | - | |
| 171 | +* | HelloGreeterNoPolyReg | NoGreeter | No | - | |
| 172 | +* +-----------------------+------------+-------------+-----------------------+ |
| 173 | +*/ |
| 174 | + |
| 175 | +class GreeterNoPolyReg |
| 176 | +{ |
| 177 | +public: |
| 178 | + using Ptr = std::shared_ptr<GreeterNoPolyReg>; |
| 179 | + std::string greet() const |
| 180 | + { |
| 181 | + return ""; |
| 182 | + }; |
| 183 | +}; |
| 184 | + |
| 185 | +class HelloGreeterNoPolyReg : public GreeterNoPolyReg |
| 186 | +{ |
| 187 | +public: |
| 188 | + using Ptr = std::shared_ptr<HelloGreeterNoPolyReg>; |
| 189 | + std::string hello_greet() |
| 190 | + { |
| 191 | + return "hello" + greet(); |
| 192 | + } |
| 193 | +}; |
| 194 | + |
| 195 | +#endif // GREETER_TEST_H_ |
0 commit comments