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), make_default<_TOther_...>::create());
15 }
16 };
17 template<typename _T_>
18 struct make_default<_T_>
19 {
20 static std::tuple<typename _T_::Type> create()
21 {
22 return std::tuple<typename _T_::Type>(_T_::Default);
23 }
24 };
25 }
31 template<typename _T_, _T_ _default_>
33 {
34 typedef _T_ Type;
35 static constexpr _T_ Default = _default_;
36 };
70 template<typename _T_, typename... _Annotation_>
71 class AnnotatedPointer
72 {
73 typedef std::tuple<typename _Annotation_::Type...> AnnotationsT;
74 public:
75 AnnotatedPointer(_T_* _t, typename _Annotation_::Type... _annotations) : t(_t), m_annotations(_annotations...)
76 {
77 }
78 AnnotatedPointer(_T_* _t) : t(_t), m_annotations( details::make_default<_Annotation_...>::create() )
79 {
80 }
81 _T_* pointer() { return t; }
82 _T_* operator*() { return t; }
83 const _T_* operator*() const { return t; }
84 std::tuple<typename _Annotation_::Type...> annotations() const { return m_annotations; }
85 template<int _index_>
86 std::tuple_element_t<_index_, AnnotationsT> get() const { return std::get<_index_>(m_annotations); }
87 public:
88 private:
89 _T_* t;
90 AnnotationsT m_annotations;
91 };
92}
93
Definition Forward.h:43
Definition AnnotatedPointer.h:11