-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathwrapper_utils.h
98 lines (83 loc) · 2.61 KB
/
wrapper_utils.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
#ifndef WRAPPER_UTILS_H
#define WRAPPER_UTILS_H
#include "boost_python.h"
#include <vector>
//-------------------------------------------------------------------------------------------------
class ScopedGILRelease
{
public:
inline ScopedGILRelease()
: m_thread_state(PyEval_SaveThread())
{
}
inline ~ScopedGILRelease()
{
PyEval_RestoreThread(m_thread_state);
}
private:
PyThreadState * m_thread_state;
};
//-------------------------------------------------------------------------------------------------
class GILStateScopedEnsure
{
public:
inline GILStateScopedEnsure()
: m_state(PyGILState_Ensure())
{
}
inline ~GILStateScopedEnsure()
{
PyGILState_Release(m_state);
}
private:
PyGILState_STATE m_state;
};
//-------------------------------------------------------------------------------------------------
template<class T>
class VersionWrapper
{
public:
inline VersionWrapper(const T & v)
{
m_v.major = v.major;
m_v.minor = v.minor;
m_v.maintenance = v.maintenance;
m_v.build = v.build;
}
inline int getMajor() const { return m_v.major; }
inline int getMinor() const { return m_v.minor; }
inline int getMaintenance() const { return m_v.maintenance; }
inline int getBuild() const { return m_v.build; }
private:
VersionWrapper() {}
T m_v;
};
template<class T>
inline std::ostream & operator << (std::ostream & output, const VersionWrapper<T> & v)
{
return output << v.getMajor() << '.' << v.getMinor() << '.' << v.getMaintenance() << '.' << v.getBuild();
}
//-------------------------------------------------------------------------------------------------
static inline bool addListener(std::vector<bp::object> & listeners, const bp::object & callback)
{
for(const auto & cb : listeners)
if(cb == callback)
return false;
const auto last_size = listeners.size();
listeners.push_back(callback);
if(last_size == 0 && listeners.size() > 0)
return true;
else
return false;
}
static inline bool removeListener(std::vector<bp::object> & listeners, const bp::object & callback)
{
const auto last_size = listeners.size();
listeners.erase(std::remove(listeners.begin(), listeners.end(), callback), listeners.end());
if(last_size != 0 && listeners.size() == 0)
return true;
else
return false;
}
//-------------------------------------------------------------------------------------------------
#endif // WRAPPER_UTILS_H