-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConfig.h
144 lines (132 loc) · 4.99 KB
/
Config.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#pragma once
#include <memory>
using namespace System::Collections::Generic;
namespace sqf
{
class configdata;
}
namespace SqfVm {
public enum class EConfigNodeType
{
Config,
Scalar,
String,
Array
};
public ref class Config : public IEnumerable<Config^>, public IReadOnlyDictionary<System::String^, Config^>
{
private:
std::shared_ptr<sqf::configdata>* m_configdata;
ref class ConfigEnumerator : public IEnumerator<Config^> {
private:
Config^ m_config;
int m_current_index;
public:
ConfigEnumerator(Config^ config) : m_config(config), m_current_index(-1) {}
virtual ~ConfigEnumerator() { }
virtual bool EnumeratorMoveNext() = System::Collections::IEnumerator::MoveNext{ return MoveNext(); }
virtual bool MoveNext()
{
m_current_index++;
return m_config->Count > m_current_index;
}
virtual void EnumeratorReset() = System::Collections::IEnumerator::Reset{ Reset(); }
virtual void Reset()
{
m_current_index = -1;
}
virtual property System::Object^ EnumeratorCurrent { System::Object^ get() sealed = System::Collections::IEnumerator::Current::get{ return Current; } }
virtual property SqfVm::Config^ Current
{
SqfVm::Config^ get()
{
if (m_current_index >= 0 && m_current_index <= m_config->Count)
{
return m_config[m_current_index];
}
else
{
throw gcnew System::InvalidOperationException();
}
}
}
};
ref class ConfigDictionaryEnumerator : public IEnumerator<System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^>> {
private:
Config^ m_config;
int m_current_index;
public:
ConfigDictionaryEnumerator(Config^ config) : m_config(config), m_current_index(-1) {}
virtual ~ConfigDictionaryEnumerator() { }
virtual bool EnumeratorMoveNext() = System::Collections::IEnumerator::MoveNext{ return MoveNext(); }
virtual bool MoveNext()
{
m_current_index++;
return m_config->Count > m_current_index;
}
virtual void EnumeratorReset() = System::Collections::IEnumerator::Reset{ Reset(); }
virtual void Reset()
{
m_current_index = -1;
}
virtual property System::Object^ EnumeratorCurrent { System::Object^ get() sealed = System::Collections::IEnumerator::Current::get{ return Current; } }
virtual property System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^> Current
{
System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^> get()
{
if (m_current_index >= 0 && m_current_index <= m_config->Count)
{
return System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^>(m_config[m_current_index]->Name, m_config[m_current_index]);
}
else
{
throw gcnew System::InvalidOperationException();
}
}
}
};
internal:
Config(const std::shared_ptr<sqf::configdata>& configdata) :
m_configdata(new std::shared_ptr<sqf::configdata>(configdata))
{
}
~Config()
{
delete m_configdata;
}
public:
void MergeWith(Config^ otherconfig);
property System::String^ Name { System::String^ get(); }
property EConfigNodeType NodeType { EConfigNodeType get(); }
property System::Object^ Value { System::Object^ get(); }
virtual property int Count { int get(); }
virtual property System::String^ ParentName { System::String^ get(); }
property Config^ default[int]{ Config^ get(int index); }
virtual property Config^ default[System::String^]{ Config^ get(System::String^ index); }
virtual property Config^ LogicalParent { Config^ get(); }
virtual property Config^ InheritedParent { Config^ get(); }
// Inherited via IEnumerable
virtual System::Collections::IEnumerator^ EnumerableGetEnumerator() = System::Collections::IEnumerable::GetEnumerator
{
return GetEnumerator();
}
// Inherited via IReadOnlyCollection
virtual System::Collections::Generic::IEnumerator<System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^>>^ DictionaryGetEnumerator() = IEnumerable<System::Collections::Generic::KeyValuePair<System::String^, SqfVm::Config^>>::GetEnumerator
{
return gcnew ConfigDictionaryEnumerator(this);
}
virtual System::Collections::Generic::IEnumerator<SqfVm::Config^>^ GetEnumerator()
{
return gcnew ConfigEnumerator(this);
}
// Inherited via IReadOnlyDictionary
virtual property System::Collections::Generic::IEnumerable<System::String^>^ Keys { System::Collections::Generic::IEnumerable<System::String^>^ get(); }
virtual property System::Collections::Generic::IEnumerable<SqfVm::Config^>^ Values { System::Collections::Generic::IEnumerable<SqfVm::Config^>^ get(); }
virtual bool ContainsKey(System::String^ key);
virtual bool TryGetValue(System::String^ key, SqfVm::Config^% value);
virtual System::String^ ToString() override
{
return System::String::Concat(gcnew System::String("Config (Name: "), Name, gcnew System::String(", NodeType: "), NodeType, gcnew System::String(")"));
}
};
}