Nazara Engine  0.4
A fast, complete, cross-platform API designed for game development
ParameterList.hpp
1 // Copyright (C) 2017 Jérôme Leclercq
2 // This file is part of the "Nazara Engine - Core module"
3 // For conditions of distribution and use, see copyright notice in Config.hpp
4 
5 #pragma once
6 
7 #ifndef NAZARA_PARAMETERLIST_HPP
8 #define NAZARA_PARAMETERLIST_HPP
9 
10 #include <Nazara/Prerequesites.hpp>
11 #include <Nazara/Core/Color.hpp>
12 #include <Nazara/Core/String.hpp>
13 #include <atomic>
14 #include <unordered_map>
15 
16 namespace Nz
17 {
18  class NAZARA_CORE_API ParameterList
19  {
20  public:
21  using Destructor = void (*)(void* value);
22 
23  ParameterList() = default;
24  ParameterList(const ParameterList& list);
25  ParameterList(ParameterList&&) = default;
26  ~ParameterList();
27 
28  void Clear();
29 
30  inline void ForEach(const std::function<bool(const ParameterList& list, const String& name)>& callback);
31  inline void ForEach(const std::function<void(const ParameterList& list, const String& name)>& callback) const;
32 
33  bool GetBooleanParameter(const String& name, bool* value) const;
34  bool GetColorParameter(const String& name, Color* value) const;
35  bool GetDoubleParameter(const String& name, double* value) const;
36  bool GetIntegerParameter(const String& name, long long* value) const;
37  bool GetParameterType(const String& name, ParameterType* type) const;
38  bool GetPointerParameter(const String& name, void** value) const;
39  bool GetStringParameter(const String& name, String* value) const;
40  bool GetUserdataParameter(const String& name, void** value) const;
41 
42  bool HasParameter(const String& name) const;
43 
44  void RemoveParameter(const String& name);
45 
46  void SetParameter(const String& name);
47  void SetParameter(const String& name, const Color& value);
48  void SetParameter(const String& name, const String& value);
49  void SetParameter(const String& name, const char* value);
50  void SetParameter(const String& name, bool value);
51  void SetParameter(const String& name, double value);
52  void SetParameter(const String& name, long long value);
53  void SetParameter(const String& name, void* value);
54  void SetParameter(const String& name, void* value, Destructor destructor);
55 
56  String ToString() const;
57 
58  ParameterList& operator=(const ParameterList& list);
59  ParameterList& operator=(ParameterList&&) = default;
60 
61  private:
62  struct Parameter
63  {
64  struct UserdataValue
65  {
66  UserdataValue(Destructor func, void* ud) :
67  counter(1),
68  destructor(func),
69  ptr(ud)
70  {
71  }
72 
73  std::atomic_uint counter;
74  Destructor destructor;
75  void* ptr;
76  };
77 
78  ParameterType type;
79  union Value
80  {
81  // We define an empty constructor/destructor, to be able to put classes in the union
82  Value() {}
83  Value(const Value&) {} // Placeholder
84  ~Value() {}
85 
86  bool boolVal;
87  double doubleVal;
88  long long intVal;
89  void* ptrVal;
90  Color colorVal;
91  String stringVal;
92  UserdataValue* userdataVal;
93  };
94 
95  Value value;
96  };
97 
98  Parameter& CreateValue(const String& name);
99  void DestroyValue(Parameter& parameter);
100 
101  using ParameterMap = std::unordered_map<String, Parameter>;
102  ParameterMap m_parameters;
103  };
104 }
105 
106 std::ostream& operator<<(std::ostream& out, const Nz::ParameterList& parameterList);
107 
108 #include <Nazara/Core/ParameterList.inl>
109 
110 #endif // NAZARA_PARAMETERLIST_HPP
Core class that represents a color.
Definition: Color.hpp:18
TODO: Inherit SoundEmitter from Node.
Definition: Algorithm.hpp:12
Core class that represents a string.
Definition: String.hpp:22
Core class that represents a list of parameters.
Definition: ParameterList.hpp:18