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