knowL: Knowledge Libraries
Loading...
Searching...
No Matches
AnnotatedPointer.h
1#pragma once
2
3#include <tuple>
4
5namespace knowCore
6{
7 namespace details
8 {
9 template<typename _T_, typename... _TOther_>
11 {
12 static std::tuple<typename _T_::Type, typename _TOther_::Type...> create()
13 {
14 return std::tuple_cat(std::tuple<typename _T_::Type>(_T_::Default),
16 }
17 };
18 template<typename _T_>
19 struct make_default<_T_>
20 {
21 static std::tuple<typename _T_::Type> create()
22 {
23 return std::tuple<typename _T_::Type>(_T_::Default);
24 }
25 };
26 } // namespace details
33 template<typename _T_, _T_ _default_>
35 {
36 typedef _T_ Type;
37 static constexpr _T_ Default = _default_;
38 };
73 template<typename _T_, typename... _Annotation_>
74 class AnnotatedPointer
75 {
76 typedef std::tuple<typename _Annotation_::Type...> AnnotationsT;
77 public:
78 AnnotatedPointer(_T_* _t, typename _Annotation_::Type... _annotations)
79 : t(_t), m_annotations(_annotations...)
80 {
81 }
82 AnnotatedPointer(_T_* _t)
83 : t(_t), m_annotations(details::make_default<_Annotation_...>::create())
84 {
85 }
86 _T_* pointer() { return t; }
87 _T_* operator*() { return t; }
88 const _T_* operator*() const { return t; }
89 std::tuple<typename _Annotation_::Type...> annotations() const { return m_annotations; }
90 template<int _index_>
91 std::tuple_element_t<_index_, AnnotationsT> get() const
92 {
93 return std::get<_index_>(m_annotations);
94 }
95 public:
96 private:
97 _T_* t;
98 AnnotationsT m_annotations;
99 };
100} // namespace knowCore
Definition Forward.h:47
Definition AnnotatedPointer.h:11