| // 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_ |