PLCnext API Documentation 25.0.2.69
EnumDictionaryBase.hxx
1
2//
3// Copyright Phoenix Contact GmbH & Co. KG
4//
6#pragma once
7
8#ifndef ARP_USE_ARP_SYSTEM_CORE
9
10#include "Arp/Base/Core/Detail/EnumDictionaryBase.hxx"
11
12#else
13
14#include "Arp/System/Core/Arp.h"
15#include <map>
16
17namespace Arp
18{
19
26template<class T>
27class EnumDictionaryBase
28{
29protected: // usings
30 using Fields = std::map<T, const char*>;
31 using InitializerList = std::initializer_list<typename Fields::value_type>;
32 using U = typename std::underlying_type<T>::type;
33
34public: // construction/destruction
35 explicit EnumDictionaryBase(const InitializerList& fields);
36 EnumDictionaryBase(const char* invalidValueString, const InitializerList& fields);
37
38protected: // string conversion operations
43 bool TryGetEnumStringInternal(T value, const char*& pResult)const;
44
49 bool TryGetEnumValueInternal(const char* fieldName, T& value)const;
50
51protected: // fields
52 Fields fields;
53 String invalidValueString;
54
55protected: // static/const fields
56 static const T zeroValue = static_cast<T>(0);
57};
58
60// inline methods of class EnumDictionary<T>
61template<class T>
62EnumDictionaryBase<T>::EnumDictionaryBase(const InitializerList& fields)
63 : fields(fields)
64{
65}
66
67template<class T>
68EnumDictionaryBase<T>::EnumDictionaryBase(const char* invalidValueString, const InitializerList& fields)
69 : fields(fields)
70 , invalidValueString(invalidValueString)
71{
72}
73
74template<class T>
75inline bool EnumDictionaryBase<T>::TryGetEnumStringInternal(T value, const char*& pResult)const
76{
77 pResult = nullptr;
78 typename Fields::const_iterator i = this->fields.find(value);
79 if (i == this->fields.end())
80 {
81 return false;
82 }
83 // else
84 pResult = i->second;
85 return true;
86}
87
88template<class T>
89inline bool EnumDictionaryBase<T>::TryGetEnumValueInternal(const char* fieldName, T& value)const
90{
91 for (const auto& item : this->fields)
92 {
93 if (::strcmp(item.second, fieldName) == 0)
94 {
95 value = item.first;
96 return true;
97 }
98 }
99 // else not found
100 return false;
101}
102
103} // end of namespace Arp
104
105#endif // ndef ARP_USE_ARP_SYSTEM_CORE
bool TryGetEnumStringInternal(T value, const char *&pResult) const
Returns the string of the specified enum value or nullptr if the value could not be found.
Definition: EnumDictionaryBase.hxx:94
std::map< T, const char * > Fields
The container type containing the value/name pairs of all enum fields.
Definition: EnumDictionaryBase.hxx:23
bool TryGetEnumValueInternal(const char *fieldName, T &value) const
Tries to get the enum value of the specified string.
Definition: EnumDictionaryBase.hxx:112
std::initializer_list< typename Fields::value_type > InitializerList
The initializer list type of the Fields container.
Definition: EnumDictionaryBase.hxx:24
typename std::underlying_type< T >::type U
The underlying integral type of the enum.
Definition: EnumDictionaryBase.hxx:25
EnumDictionaryBase(const InitializerList &fields)
Constructor passing the enum fields as initializer list.
Definition: EnumDictionaryBase.hxx:54
Root namespace for the PLCnext API