32 Any() : content_(NULL) {}
34 template <
typename ValueType>
35 explicit Any(
const ValueType &value)
36 : content_(new Holder<ValueType>(value)) {}
39 : content_(other.content_ ? other.content_->Clone() : nullptr) {}
41 ~Any() {
delete content_; }
43 template <
typename ValueType>
45 return content_ ? &(
static_cast<Holder<ValueType> *
>(content_)->held_)
52 virtual ~PlaceHolder() {}
53 virtual PlaceHolder *Clone()
const = 0;
56 template <
typename ValueType>
57 class Holder :
public PlaceHolder {
59 explicit Holder(
const ValueType &value) : held_(value) {}
61 virtual PlaceHolder *Clone()
const {
return new Holder(held_); }
66 PlaceHolder *content_;
80typedef std::map<std::string, ObjectFactory *>
FactoryMap;
85 const std::string &base_class_name,
86 std::vector<std::string> *registered_derived_classes_names);
92#define PERCEPTION_REGISTER_REGISTERER(base_class) \
93 class base_class##Registerer { \
94 typedef ::apollo::perception::lib::Any Any; \
95 typedef ::apollo::perception::lib::FactoryMap FactoryMap; \
98 static base_class *GetInstanceByName(const ::std::string &name) { \
100 ::apollo::perception::lib::GlobalFactoryMap()[#base_class]; \
101 FactoryMap::iterator iter = map.find(name); \
102 if (iter == map.end()) { \
103 for (auto c : map) { \
104 AERROR << "Instance:" << c.first; \
106 AERROR << "Get instance " << name << " failed."; \
109 Any object = iter->second->NewInstance(); \
110 return *(object.AnyCast<base_class *>()); \
112 static std::vector<base_class *> GetAllInstances() { \
113 std::vector<base_class *> instances; \
115 ::apollo::perception::lib::GlobalFactoryMap()[#base_class]; \
116 instances.reserve(map.size()); \
117 for (auto item : map) { \
118 Any object = item.second->NewInstance(); \
119 instances.push_back(*(object.AnyCast<base_class *>())); \
123 static const ::std::string GetUniqInstanceName() { \
125 ::apollo::perception::lib::GlobalFactoryMap()[#base_class]; \
126 CHECK_EQ(map.size(), 1U) << map.size(); \
127 return map.begin()->first; \
129 static base_class *GetUniqInstance() { \
131 ::apollo::perception::lib::GlobalFactoryMap()[#base_class]; \
132 CHECK_EQ(map.size(), 1U) << map.size(); \
133 Any object = map.begin()->second->NewInstance(); \
134 return *(object.AnyCast<base_class *>()); \
136 static bool IsValid(const ::std::string &name) { \
138 ::apollo::perception::lib::GlobalFactoryMap()[#base_class]; \
139 return map.find(name) != map.end(); \
143#define PERCEPTION_REGISTER_CLASS(clazz, name) \
145 class ObjectFactory##name : public apollo::perception::lib::ObjectFactory { \
147 virtual ~ObjectFactory##name() {} \
148 virtual ::apollo::perception::lib::Any NewInstance() { \
149 return ::apollo::perception::lib::Any(new name()); \
152 __attribute__((constructor)) void RegisterFactory##name() { \
153 ::apollo::perception::lib::FactoryMap &map = \
154 ::apollo::perception::lib::GlobalFactoryMap()[#clazz]; \
155 if (map.find(#name) == map.end()) map[#name] = new ObjectFactory##name(); \
Any(const ValueType &value)
ObjectFactory(const ObjectFactory &)=delete
ObjectFactory & operator=(const ObjectFactory &)=delete
virtual Any NewInstance()
bool GetRegisteredClasses(const std::string &base_class_name, std::vector< std::string > *registered_derived_classes_names)
std::map< std::string, ObjectFactory * > FactoryMap
std::map< std::string, FactoryMap > BaseClassMap
BaseClassMap & GlobalFactoryMap()