Field.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Attribute.hpp"
4 
5 #include "../Basics/valgrind.hpp"
6 
7 #include <any>
8 #include <optional>
9 
10 namespace iv
11 {
12 
13 //================================== FieldI ==========================================
14 class FieldI
15 {
16 public:
17  enum class Assignment
18  {
19  Unassigned,
20  Constant,
23  };
24 
25 public:
26  FieldI(){}
27  FieldI( FieldI const & ) = delete;
28  FieldI & operator=( FieldI const & ) = delete;
29 
30 //--------------------------------- generic access ---------
33 
34  std::type_index Type();
35  Attribute::ValueMode Mode() const;
37 
38 private:
39  virtual void AnySource_R_Impl( Attribute * ) = 0;
40  virtual void AnySource_RW_Impl( Attribute * ){}
41  virtual std::type_index Type_Impl() = 0;
42 
43  virtual Attribute::ValueMode mode_Impl() const = 0;
44  virtual Assignment AssignmentState_impl() const = 0;
45 };
46 
47 
48 //================================== Field ========================================
49 template< class T >
50 class Field : public FieldI, private AttributeListener
51 {
52 public:
54 
55  Field( Instance * inst );
56  ~Field();
57 
58  Instance * instance() const;
59 
63  void Release_Attribute();
64 
69  void Assign_Attribute_R( Attr< T > * );
70 
76 
79  void Assign_Constant( T const & );
80 
85  T Get() const;
86 
92  void Modify( T const & );
93 
94 protected:
101  virtual void OnChanged( bool real ) = 0;
102 
103 private:
104  virtual void Attribute_Changed( Attribute * ) override;
105  virtual void Attribute_Deactivated( Attribute * ) override;
106 
107 private:
108  virtual void AnySource_R_Impl( Attribute * ) override;
109  virtual void AnySource_RW_Impl( Attribute * ) override;
110  virtual std::type_index Type_Impl() override;
111  virtual Attribute::ValueMode mode_Impl() const override;
112  virtual Assignment AssignmentState_impl() const override;
113 
114 protected:
116  std::optional< T > constant;
119 };
120 
121 //====================================================================================
122 
123 template<>
124 struct StringIO< FieldI::Assignment > : public StringIO_Table< FieldI::Assignment >
125 {
126  static const ValuesType Values;
127 };
128 
129 //-------------------- StringIO< Field > -------------------------------
130 template< class T >
131 struct StringIO< Field< T > >
132 {
133  std::string Write( Field< T > const & value, Context const * context ) const
134  {
135  std::stringstream ss;
136  ss << StringIO_Write( value.AssignmentState(), context ) << "/" << StringIO_Write( value.Mode(), context ) << "/" << StringIO_Write( value.Get(), context );
137  return ss.str();
138  }
139 };
140 
141 }
142 
143 #include "Field.inl"