blob: b6cfca3461bd827b50f7b60b1aa9e9c4c856895a [file] [log] [blame]
// 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_