diff options
Diffstat (limited to 'src/include/tome/enum_string_map.hpp')
-rw-r--r-- | src/include/tome/enum_string_map.hpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/include/tome/enum_string_map.hpp b/src/include/tome/enum_string_map.hpp new file mode 100644 index 00000000..8ae1e115 --- /dev/null +++ b/src/include/tome/enum_string_map.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include <boost/bimap.hpp> +#include <boost/noncopyable.hpp> +#include <string> +#include <cassert> + +/** + * Bidirectional mapping between enumerated values + * and strings. + */ +template <class E> +class EnumStringMap : boost::noncopyable { + +private: + typedef boost::bimap< E, std::string > bimap_type; + typedef typename bimap_type::value_type value_type; + + bimap_type bimap; + +public: + explicit EnumStringMap(std::initializer_list< std::pair<E, const char *> > in) { + for (auto es : in) + { + bimap.insert(value_type(es.first, es.second)); + } + // Sanity check that there were no + // duplicate mappings. + assert(bimap.size() == in.size()); + } + + const char *stringify(E e) { + auto i = bimap.left.find(e); + assert(i != bimap.left.end() && "Missing mapping for enumerated value"); + return i->second.c_str(); + } + + E parse(const char *s) { + E e; + bool result = parse(s, &e); + assert(result && "Missing string->enum mapping"); + return e; + } + + bool parse(const char *s, E *e) { + auto i = bimap.right.find(s); + if (i == bimap.right.end()) + { + return false; + } + + *e = i->second; + return true; + } +}; |