1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard //
5*3f982cf4SFabien Sanglard // This file contains helpers for working with enums that require
6*3f982cf4SFabien Sanglard // both enum->string and string->enum conversions.
7*3f982cf4SFabien Sanglard
8*3f982cf4SFabien Sanglard #ifndef UTIL_ENUM_NAME_TABLE_H_
9*3f982cf4SFabien Sanglard #define UTIL_ENUM_NAME_TABLE_H_
10*3f982cf4SFabien Sanglard
11*3f982cf4SFabien Sanglard #include <array>
12*3f982cf4SFabien Sanglard #include <utility>
13*3f982cf4SFabien Sanglard
14*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h"
15*3f982cf4SFabien Sanglard #include "platform/base/error.h"
16*3f982cf4SFabien Sanglard #include "util/osp_logging.h"
17*3f982cf4SFabien Sanglard
18*3f982cf4SFabien Sanglard namespace openscreen {
19*3f982cf4SFabien Sanglard
20*3f982cf4SFabien Sanglard constexpr char kUnknownEnumError[] = "Enum value not in array";
21*3f982cf4SFabien Sanglard
22*3f982cf4SFabien Sanglard // TODO(jophba): move to a proper class once we can inherit from array
23*3f982cf4SFabien Sanglard // properly (in C++17).
24*3f982cf4SFabien Sanglard template <typename Enum, size_t Size>
25*3f982cf4SFabien Sanglard using EnumNameTable = std::array<std::pair<const char*, Enum>, Size>;
26*3f982cf4SFabien Sanglard
27*3f982cf4SFabien Sanglard // Get the name of an enum from the enum value.
28*3f982cf4SFabien Sanglard template <typename Enum, size_t Size>
GetEnumName(const EnumNameTable<Enum,Size> & map,Enum enum_)29*3f982cf4SFabien Sanglard ErrorOr<const char*> GetEnumName(const EnumNameTable<Enum, Size>& map,
30*3f982cf4SFabien Sanglard Enum enum_) {
31*3f982cf4SFabien Sanglard for (auto pair : map) {
32*3f982cf4SFabien Sanglard if (pair.second == enum_) {
33*3f982cf4SFabien Sanglard return pair.first;
34*3f982cf4SFabien Sanglard }
35*3f982cf4SFabien Sanglard }
36*3f982cf4SFabien Sanglard return Error(Error::Code::kParameterInvalid, kUnknownEnumError);
37*3f982cf4SFabien Sanglard }
38*3f982cf4SFabien Sanglard
39*3f982cf4SFabien Sanglard // Get the value of an enum from the enum name.
40*3f982cf4SFabien Sanglard template <typename Enum, size_t Size>
GetEnum(const EnumNameTable<Enum,Size> & map,absl::string_view name)41*3f982cf4SFabien Sanglard ErrorOr<Enum> GetEnum(const EnumNameTable<Enum, Size>& map,
42*3f982cf4SFabien Sanglard absl::string_view name) {
43*3f982cf4SFabien Sanglard for (auto pair : map) {
44*3f982cf4SFabien Sanglard if (pair.first == name) {
45*3f982cf4SFabien Sanglard return pair.second;
46*3f982cf4SFabien Sanglard }
47*3f982cf4SFabien Sanglard }
48*3f982cf4SFabien Sanglard return Error(Error::Code::kParameterInvalid, kUnknownEnumError);
49*3f982cf4SFabien Sanglard }
50*3f982cf4SFabien Sanglard
51*3f982cf4SFabien Sanglard } // namespace openscreen
52*3f982cf4SFabien Sanglard #endif // UTIL_ENUM_NAME_TABLE_H_
53