libart-paperback 0.1.0-a.1.20260122225059.e5fea306241a
PDF (1.4) library for C++
object-model.hxx
1#ifndef art__paperback__carousel__object_model_hxx_
2#define art__paperback__carousel__object_model_hxx_
3
4#include <art/paperback/types.hxx>
5#include <art/paperback/forward.hxx>
6#include <art/paperback/visitor.hxx>
7
8#include <typeinfo>
9
11{
12
13 /// Abstract base class for object tree.
14 ///
16 {
17 public:
18 /// Destructor.
19 ///
20 virtual
21 ~Abstract() noexcept;
22
23 /// Get contained type info.
24 ///
25 virtual
26 std::type_info const&
27 type() const = 0;
28
29 /// Get container.
30 ///
31 virtual
33 container() = 0;
34
35 /// Get container.
36 ///
37 virtual
38 Container_base const&
39 container() const = 0;
40
41 /// Access node owner.
42 ///
43 virtual
44 Owner*
45 owner() = 0;
46
47 /// Access node owner.
48 ///
49 virtual
50 Owner const*
51 owner() const = 0;
52
53 /// Attach node to owner.
54 ///
55 virtual
56 void
58
59 /// Clone.
60 ///
61 virtual
62 shared_ptr<Abstract>
63 clone() const = 0;
64
65 protected:
66 /// Constructor.
67 ///
68 Abstract();
69
70 private:
71 Abstract(Abstract const&) = delete;
72 Abstract(Abstract&&) = delete;
73 Abstract& operator=(Abstract const&) = delete;
74 Abstract& operator=(Abstract&&) = delete;
75
76 };
77
78 /// Base class for containers.
79 ///
81 : public Abstract
82 {
83 public:
84 /// Destructor.
85 ///
86 ~Container_base() noexcept override;
87
88 /// Get.
89 ///
90 template<typename T>
91 T&
93 {
94 return dynamic_cast<Container<T>&>(*this).get();
95 }
96
97 /// Get.
98 ///
99 template<typename T>
100 T const&
101 get() const
102 {
103 return dynamic_cast<Container<T> const&>(*this).get();
104 }
105
106 virtual
107 void
108 assign(Container_base const&) = 0;
109
110 virtual
111 bool
112 compare(Container_base const&) const = 0;
113
114 virtual
115 void
116 do_accept(Visitor&) = 0;
117
118 virtual
119 void
120 do_accept(Visitor&) const = 0;
121
122 protected:
123 /// Constructor.
124 ///
126
127 private:
128 Container_base(Container_base const&) = delete;
129 Container_base(Container_base&&) = delete;
130 Container_base& operator=(Container_base const&) = delete;
131 Container_base& operator=(Container_base&&) = delete;
132
133 };
134
135 template<typename T>
136 class Container
137 : public Container_base,
138 public std::enable_shared_from_this<Container<T>>
139 {
140 public:
141 template<typename... Args>
142 explicit
143 Container(Args&&... args)
144 : _value{std::forward<Args>(args)...}
145 {}
146
148 container() override
149 {
150 return *this;
151 }
152
153 Container_base const&
154 container() const override
155 {
156 return *this;
157 }
158
159 std::type_info const&
160 type() const override
161 {
162 return typeid(T);
163 }
164
165 T&
166 get()
167 {
168 return _value;
169 }
170
171 T const&
172 get() const
173 {
174 return _value;
175 }
176
177 void
178 assign(Container_base const& other) override
179 {
180 _value = other.get<T>();
181 }
182
183 bool
184 compare(Container_base const& other) const override
185 {
186 return _value == other.get<T>();
187 }
188
189 void
190 do_accept(Visitor& v) override
191 {
192 accept(_value, v);
193 }
194
195 void
196 do_accept(Visitor& v) const override
197 {
198 accept(_value, v);
199 }
200
201 Owner*
202 owner() override
203 {
204 return _value.owner();
205 }
206
207 Owner const*
208 owner() const override
209 {
210 return _value.owner();
211 }
212
213 void
214 attach(Owner& owner) override
215 {
216 return _value.attach(owner);
217 }
218
219 shared_ptr<Abstract>
220 clone() const override
221 {
222 return make_shared<Container<T>>(_value);
223 }
224
225 private:
226 Container(Container<T> const&) = delete;
227 Container(Container<T>&&) = delete;
228 Container<T>& operator=(Container<T> const&) = delete;
229 Container<T>& operator=(Container<T>&&) = delete;
230
231 private:
232 T _value;
233
234 };
235
236 /// Represents a reference to an indirect object.
237 ///
239 : public Abstract,
240 public std::enable_shared_from_this<Reference>
241 {
242 public:
243 /// Constructor.
244 ///
246
247 /// Access parent file.
248 ///
249 File&
250 file() const;
251
252 /// Access the identity of this reference.
253 ///
254 Identity const&
255 identity() const;
256
257 std::type_info const&
258 type() const override;
259
261 container() override;
262
263 Container_base const&
264 container() const override;
265
266 Owner*
267 owner() override;
268
269 Owner const*
270 owner() const override;
271
272 void
273 attach(Owner& owner) override;
274
275 /// Clone.
276 ///
277 shared_ptr<Abstract>
278 clone() const override;
279
280 private:
281 Reference(Reference const&) = delete;
282 Reference(Reference&&) = delete;
283 Reference& operator=(Reference const&) = delete;
284 Reference& operator=(Reference&&) = delete;
285
286 private:
287 File& _file;
288 Identity _identity;
289
290 };
291
292 /// Base class for value types.
293 ///
295 {
296 public:
297 /// Attach value to owner.
298 ///
299 void
300 attach(Owner&);
301
302 /// Access owner, if any.
303 ///
304 Owner*
305 owner();
306
307 /// Access owner, if any.
308 ///
309 Owner const*
310 owner() const;
311
312 protected:
313 /// Constructor.
314 ///
315 Value_base();
316
317 /// Destructor.
318 ///
319 ~Value_base();
320
321 /// Attach any children.
322 ///
323 virtual
324 void
326
327 private:
328 Value_base(Value_base const&) = delete;
329 Value_base(Value_base&&) = delete;
330 Value_base& operator=(Value_base const&) = delete;
331 Value_base& operator=(Value_base&&) = delete;
332
333 private:
334 Owner* _owner{};
335
336 };
337
338 /// Owner of an indirect object.
339 ///
340 class Owner
341 {
342 public:
343 /// Constructor.
344 ///
345 explicit
346 Owner(shared_ptr<Container_base>);
347
348 /// Destructor.
349 ///
350 ~Owner() noexcept;
351
352 /// Access container.
353 ///
355 container();
356
357 /// Access container.
358 ///
359 Container_base const&
360 container() const;
361
362 /// Check if modified.
363 ///
364 bool
365 modified() const;
366
367 /// Mark as modified.
368 ///
369 void
371
372 /// Reset modification mark.
373 ///
374 void
375 reset();
376
377 private:
378 Owner(Owner const&) = delete;
379 Owner(Owner&&) = delete;
380 Owner& operator=(Owner const&) = delete;
381 Owner& operator=(Owner&&) = delete;
382
383 private:
384 shared_ptr<Container_base> _container;
385
386 /// Change tracking.
387 ///
388 bool _modified{true};
389
390 };
391
392} // namespace Art::Paperback::Carousel::Object_model
393
394#endif
Represents a COS-format file.
Definition file.hxx:19
virtual Owner const * owner() const =0
Access node owner.
virtual ~Abstract() noexcept
Destructor.
Definition object-model.cxx:14
virtual std::type_info const & type() const =0
Get contained type info.
virtual Owner * owner()=0
Access node owner.
virtual Container_base & container()=0
Get container.
virtual Container_base const & container() const =0
Get container.
virtual shared_ptr< Abstract > clone() const =0
Clone.
Abstract()
Constructor.
Definition object-model.cxx:18
virtual void attach(Owner &)=0
Attach node to owner.
Base class for containers.
Definition object-model.hxx:82
Container_base()
Constructor.
Definition object-model.cxx:29
T const & get() const
Get.
Definition object-model.hxx:101
T & get()
Get.
Definition object-model.hxx:92
~Container_base() noexcept override
Destructor.
Definition object-model.cxx:25
std::type_info const & type() const override
Get contained type info.
Definition object-model.hxx:160
Owner * owner() override
Access node owner.
Definition object-model.hxx:202
Container_base & container() override
Get container.
Definition object-model.hxx:148
Container_base const & container() const override
Get container.
Definition object-model.hxx:154
Owner const * owner() const override
Access node owner.
Definition object-model.hxx:208
void attach(Owner &owner) override
Attach node to owner.
Definition object-model.hxx:214
shared_ptr< Abstract > clone() const override
Clone.
Definition object-model.hxx:220
Owner of an indirect object.
Definition object-model.hxx:341
bool modified() const
Check if modified.
Definition object-model.cxx:195
void mark_as_modified()
Mark as modified.
Definition object-model.cxx:202
Container_base & container()
Access container.
Definition object-model.cxx:181
Owner(shared_ptr< Container_base >)
Constructor.
Definition object-model.cxx:165
bool _modified
Change tracking.
Definition object-model.hxx:388
void reset()
Reset modification mark.
Definition object-model.cxx:209
~Owner() noexcept
Destructor.
Definition object-model.cxx:176
Identity const & identity() const
Access the identity of this reference.
Definition object-model.cxx:54
std::type_info const & type() const override
Get contained type info.
Definition object-model.cxx:61
Container_base & container() override
Get container.
Definition object-model.cxx:68
shared_ptr< Abstract > clone() const override
Clone.
Definition object-model.cxx:104
Owner * owner() override
Access node owner.
Definition object-model.cxx:82
Reference(File &, Identity)
Constructor.
Definition object-model.cxx:40
File & file() const
Access parent file.
Definition object-model.cxx:47
void attach(Owner &owner) override
Attach node to owner.
Definition object-model.cxx:96
~Value_base()
Destructor.
Definition object-model.cxx:149
void attach(Owner &)
Attach value to owner.
Definition object-model.cxx:116
Value_base()
Constructor.
Definition object-model.cxx:145
Owner * owner()
Access owner, if any.
Definition object-model.cxx:130
virtual void attach_children(Owner &)
Attach any children.
Definition object-model.cxx:156
Virtual base class for visitors.
Definition visitor.hxx:10
COS object model namespace.
Definition object-model.cxx:8
void accept(Object &visitee, Visitor &v)
Accept visitor on object.
Definition object.cxx:312
Represents the identity of an indirect object.
Definition types.hxx:81