17 #ifndef _GAZEBO_ENUMITERATOR_HH_
18 #define _GAZEBO_ENUMITERATOR_HH_
38 #define GZ_ENUM(enumType, begin, end, ...) \
39 template<> enumType common::EnumIface<enumType>::range[] = {begin, end}; \
40 template<> std::vector<std::string> common::EnumIface<enumType>::names = \
50 public:
static T Begin()
57 public:
static T End()
67 static std::string Str(T
const &_e)
69 if (_e < names.size())
80 static void Set(T &_e,
const std::string &_str)
82 static auto begin = std::begin(names);
83 static auto end = std::end(names);
85 auto find = std::find(begin, end, _str);
88 _e =
static_cast<T
>(std::distance(begin, find));
94 public:
static T range[2];
99 public:
static std::vector<std::string> names;
130 template<
typename Enum>
132 : std::iterator<std::bidirectional_iterator_tag, Enum>
135 public: EnumIterator() : c(this->End())
141 public: EnumIterator(
const Enum _c) : c(_c)
143 GZ_ASSERT(this->c >= this->Begin() && this->c <= this->End(),
144 "Invalid enum value in EnumIterator constructor");
149 public: EnumIterator &operator=(
const Enum _c)
151 GZ_ASSERT(_c >= this->Begin() && _c <= this->End(),
152 "Invalid operator= value in EnumIterator");
159 public:
static Enum Begin()
161 return EnumIface<Enum>::Begin();
166 public:
static Enum End()
168 return EnumIface<Enum>::End();
173 public: EnumIterator &operator++()
175 GZ_ASSERT(this->c != this->End(),
"Incrementing past end of enum");
176 this->c =
static_cast<Enum
>(this->c + 1);
182 public: EnumIterator operator++(
const int)
184 GZ_ASSERT(this->c != this->End(),
"Incrementing past end of enum");
185 EnumIterator cpy(*
this);
192 public: EnumIterator &operator--()
194 GZ_ASSERT(this->c != this->Begin(),
"decrementing beyond begin?");
195 this->c =
static_cast<Enum
>(this->c - 1);
201 public: EnumIterator operator--(
const int)
203 GZ_ASSERT(this->c != this->Begin(),
"Decrementing beyond beginning.");
204 EnumIterator cpy(*
this);
211 public: Enum operator*()
const
213 GZ_ASSERT(this->c != this->End(),
"Cannot dereference end iterator");
219 public: Enum Value()
const
234 template<
typename Enum>
235 bool operator==(EnumIterator<Enum> _e1, EnumIterator<Enum> _e2)
237 return _e1.Value() == _e2.Value();
244 template<
typename Enum>
245 bool operator!=(EnumIterator<Enum> _e1, EnumIterator<Enum> _e2)
247 return !(_e1 == _e2);
#define GZ_ASSERT(_expr, _msg)
This macro define the standard way of launching an exception inside gazebo.
Definition: Assert.hh:24
GAZEBO_VISIBLE void Set(common::Image &_img, const msgs::Image &_msg)
Convert a msgs::Image to a common::Image.