rttr  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
enumeration_container.h
Go to the documentation of this file.
1 /************************************************************************************
2 * *
3 * Copyright (c) 2014 Axel Menzel <info@axelmenzel.de> *
4 * *
5 * This file is part of RTTR (Run Time Type Reflection) *
6 * License: MIT License *
7 * *
8 * Permission is hereby granted, free of charge, to any person obtaining *
9 * a copy of this software and associated documentation files (the "Software"), *
10 * to deal in the Software without restriction, including without limitation *
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
12 * and/or sell copies of the Software, and to permit persons to whom the *
13 * Software is furnished to do so, subject to the following conditions: *
14 * *
15 * The above copyright notice and this permission notice shall be included in *
16 * all copies or substantial portions of the Software. *
17 * *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE *
24 * SOFTWARE. *
25 * *
26 *************************************************************************************/
27 
28 #ifndef __RTTR_ENUMERATION_CONTAINER_H__
29 #define __RTTR_ENUMERATION_CONTAINER_H__
30 
33 #include "rttr/detail/argument.h"
34 #include "rttr/variant.h"
35 
36 #include <utility>
37 #include <type_traits>
38 
39 namespace rttr
40 {
41 namespace detail
42 {
43 
44 template<typename EnumType>
45 class enumeration_container : public enumeration_container_base
46 {
47  public:
48  enumeration_container(const type declaring_type, std::vector< std::pair<std::string, EnumType> > data)
49  : enumeration_container_base(declaring_type),
50  _keyToValue(move(data))
51  {
52  static_assert(std::is_enum<EnumType>::value, "No enum type provided, please create an instance of this class only for enum types!");
53  }
54 
55  type get_type() const { return type::get<EnumType>(); }
56  type get_underlying_type() const { return type::get<typename std::underlying_type<EnumType>::type>(); }
57 
58  std::vector<std::string> get_keys() const
59  {
60  std::vector<std::string> result;
61  for (const auto& item : _keyToValue)
62  {
63  result.push_back(item.first);
64  }
65  return result;
66  }
67 
68  std::vector<variant> get_values() const
69  {
70  std::vector<variant> result;
71  for (const auto& item : _keyToValue)
72  {
73  result.push_back(item.second);
74  }
75  return result;
76  }
77 
78  std::string value_to_key(detail::argument& value) const
79  {
80  if (!value.is_type<EnumType>() &&
81  !value.is_type<typename std::underlying_type<EnumType>::type>())
82  {
83  return std::string();
84  }
85 
86  EnumType enum_value = value.get_value<EnumType>();
87  for (const auto& item : _keyToValue)
88  {
89  if (item.second == enum_value)
90  return item.first;
91  }
92  return std::string();
93  }
94 
95  variant key_to_value(const std::string& key) const
96  {
97  if (key.empty())
98  return variant();
99 
100  for (const auto& item : _keyToValue)
101  {
102  if (item.first == key)
103  return item.second;
104  }
105  return variant();
106  }
107 
108  private:
109  std::vector<std::pair<std::string, EnumType> > _keyToValue;
110 };
111 
113 
114 } // end namespace detail
115 } // end namespace rttr
116 
117 #endif // __RTTR_CONSTRUCTOR_CONTAINER_H__