| // Copyright 2015 The Weave Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_ | |
| #define LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_ | |
| #include <string> | |
| #include <base/logging.h> | |
| namespace weave { | |
| // Helps to map enumeration to stings and back. | |
| // | |
| // Usage example: | |
| // .h file: | |
| // enum class MyEnum { kV1, kV2 }; | |
| // | |
| // .cc file: | |
| // template <> | |
| // EnumToStringMap<MyEnum>::EnumToStringMap() : EnumToStringMap(kMap) { }; | |
| template <typename T> | |
| class EnumToStringMap final { | |
| static_assert(std::is_enum<T>::value, "The type must be an enumeration"); | |
| public: | |
| struct Map { | |
| const T id; | |
| const char* const name; | |
| }; | |
| EnumToStringMap(); | |
| const Map* begin() const { return begin_; } | |
| const Map* end() const { return end_; } | |
| private: | |
| template <size_t size> | |
| explicit EnumToStringMap(const Map(&map)[size]) | |
| : begin_(map), end_(map + size) {} | |
| const Map* begin_; | |
| const Map* end_; | |
| }; | |
| template <typename T> | |
| std::string EnumToString(T id) { | |
| for (const auto& m : EnumToStringMap<T>()) { | |
| if (m.id == id) { | |
| CHECK(m.name); | |
| return m.name; | |
| } | |
| } | |
| NOTREACHED() << static_cast<int>(id); | |
| return std::string(); | |
| } | |
| template <typename T> | |
| bool StringToEnum(const std::string& name, T* id) { | |
| for (const auto& m : EnumToStringMap<T>()) { | |
| if (m.name && m.name == name) { | |
| *id = m.id; | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| } // namespace weave | |
| #endif // LIBWEAVE_INCLUDE_WEAVE_ENUM_TO_STRING_H_ |