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