Repository navigation
Expand file tree
/
Copy pathenum_macro.hpp
More file actions
70 lines (59 loc) · 3.72 KB
/
Copy pathenum_macro.hpp
File metadata and controls
70 lines (59 loc) · 3.72 KB
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
/*
Copyright (C) 2015-present The DotCpp Authors.
This file is part of .C++, a native C++ implementation of
popular .NET class library APIs developed to facilitate
code reuse between C# and C++.
http://github.com/dotcpp/dotcpp (source)
http://dotcpp.org (documentation)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#pragma once
#define DOT_ENUM_BEGIN(nspace, name) \
private: \
static dot::object make_self() { return self(); } \
\
public: \
typedef self element_type; \
typedef dot::struct_wrapper_impl<self>* pointer_type; \
using dot::enum_base::enum_base; \
\
operator dot::object() { return new dot::struct_wrapper_impl<self>(*this); } \
operator int() const { return value_; } \
self& operator=(int rhs) { value_ = rhs; return *this; } \
self& operator=(const self& other) { value_ = other.value_; return *this; } \
virtual dot::type get_type() { return typeof(); } \
static dot::type typeof() \
{ \
static dot::type result = []()->dot::type \
{ \
dot::type t = dot::make_type_builder<self>(nspace, name) \
->is_enum() \
->with_constructor(&self::make_self, {}) \
->with_base<enum_base>() \
->build(); \
return t; \
}(); \
return result; \
} \
\
protected: \
virtual dot::dictionary<dot::string, int> get_enum_map() override \
{ \
static dot::dictionary<dot::string, int> enum_map_ = []() \
{ \
auto map_ = dot::make_dictionary<dot::string, int>();
#define DOT_ENUM_VALUE(value) \
map_[#value] = value;
#define DOT_ENUM_END() \
return map_; \
}(); \
return enum_map_; \
}