Adobe Source Libraries 1.49.0
A collection of C++ libraries.
Loading...
Searching...
No Matches
adam.hpp
Go to the documentation of this file.
1/*
2 Copyright 2013 Adobe
3 Distributed under the Boost Software License, Version 1.0.
4 (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5*/
6/**************************************************************************************************/
7
8#ifndef ADOBE_ADAM_HPP
9#define ADOBE_ADAM_HPP
10
11#include <adobe/config.hpp>
12
13#include <functional>
14#include <optional>
15#include <vector>
16
17#include <boost/signals2/signal.hpp>
18
20#include <adobe/array.hpp>
22#include <adobe/istream.hpp>
23#include <adobe/name.hpp>
25
26/*
27
28 REVISIT (sparent) : It would be best to untangle the sheet from
29 the virtual machine. The way to do this is to allow for function
30 objects to be passed instead of line positions and expression
31 arrays. The function object could bind to the line_position_t and
32 the array.... This would allow for easier programmatic driving.
33
34*/
35
36/**************************************************************************************************/
37
38namespace adobe {
39
47
48/**************************************************************************************************/
49
56class sheet_t : boost::noncopyable {
57public:
58 struct relation_t;
59
60 using monitor_invariant_t = std::function<void(bool)>;
61 using monitor_value_t = std::function<void(const any_regular_t&)>;
62 using monitor_contributing_t = std::function<void(const dictionary_t&)>;
63 using monitor_enabled_t = std::function<void(bool)>;
64
77
78 typedef boost::signals2::connection connection_t;
79
80#if !defined(ADOBE_NO_DOCUMENTATION)
83#endif
84
92 any_regular_t inspect(const array_t& expression);
93
100 void set(name_t cell, const any_regular_t& value); // input cell.
101
123 void touch(const name_t* first, const name_t* last); // range of input cells.
124
132
133 // REVISIT (sparent) : get() is likely a bad name giving the pairing with set.
135
141 const any_regular_t& operator[](name_t cell) const;
142
154 void add_input(name_t name, const line_position_t& position, const array_t& initializer);
155
167
168 void add_output(name_t name, const line_position_t& position, const array_t& expression);
169
170
184 void add_constant(name_t name, const line_position_t& position, const array_t& initializer);
185
186
195
207 void add_logic(name_t name, const line_position_t& position, const array_t& expression);
208
220 void add_invariant(name_t name, const line_position_t& position, const array_t& expression);
221
242 void add_interface(name_t name, bool linked, const line_position_t& position1,
243 const array_t& initializer, const line_position_t& position2,
244 const array_t& expression);
245
257 void add_interface(name_t name, any_regular_t initial);
258
280 void add_relation(const line_position_t& position, const array_t& conditional,
281 const relation_t* first, const relation_t* last);
282
283
299
322 const monitor_contributing_t& proc);
323 // output only
324
377 connection_t monitor_enabled(name_t cell, const name_t* first, const name_t* last,
378 const monitor_enabled_t& proc); // input only
379
380#if 0
381 connection_t monitor_invariant_contributing(name_t input, const monitor_invariant_t&);
382#endif
383
401
402
413 bool has_input(name_t name) const;
414
425 bool has_output(name_t name) const;
426
436
437 std::size_t count_interface(name_t name) const { return has_input(name) && has_output(name); }
438
439
447 void update();
448
458
459
468 void set(const dictionary_t& dictionary);
469
470#if 0
471 dictionary_t current_mark() const;
472#endif
473
474
483
489
491
496
497 /*
498 REVISIT (fbrereto) : From a note from sparent 2007/04/13:
499
500 "Make the adam VM public - eventually I'm going to pull it out all
501 together (The property model library won't directly depend on it -
502 only function object - which can be implemented with the VM)."
503
504 This solution is a bit hackish, but is a viable intermediary solution;
505 because sheet_t and its underlying implementation are noncopyable, the
506 machine can be stored here and held by reference by the implementation,
507 and everything is fine. Nevertheless, this is an interim solution given
508 Sean's plans for the VM's relationship to sheet_t in the future.
509 */
511
512private:
513 class implementation_t;
514 implementation_t* object_m;
515};
516
517/**************************************************************************************************/
518
524
526 set_monitor_t(sheet_t& sheet, name_t cell_name) : cell_name_m(cell_name), sheet_m(sheet) {}
527
528 void operator()(const any_regular_t& x) { sheet_m.get().set(cell_name_m, x); }
529
530private:
531 name_t cell_name_m;
532 boost::reference_wrapper<sheet_t> sheet_m;
533};
534
535/**************************************************************************************************/
536
537/*
538 REVISIT (sparent) : line_position_t and array_t need to go in favor of a function object.
539*/
540
548 relation_t(std::vector<name_t> n, line_position_t p, array_t e)
549 : name_set_m(std::begin(n), std::end(n)), position_m(p), expression_m(std::move(e)) {}
550
551 friend void swap(relation_t& x, relation_t& y) {
555 }
556
557 relation_t(relation_t&& x) noexcept
558 : name_set_m(x.name_set_m), position_m(x.position_m),
559 expression_m(std::move(x.expression_m)) {}
560
561 relation_t(const relation_t&) = default;
562
564 swap(*this, x);
565 return *this;
566 }
567
568
569 std::vector<name_t> name_set_m;
572};
573
574/**************************************************************************************************/
575
576} // namespace adobe
577
578/**************************************************************************************************/
579
580#endif
581
582/**************************************************************************************************/
The fundamental data structure for the Property Model engine.
Definition adam.hpp:56
void add_input(name_t name, const line_position_t &position, const array_t &initializer)
connection_t monitor_contributing(name_t cell, const dictionary_t &mark, const monitor_contributing_t &proc)
std::size_t count_interface(name_t name) const
Definition adam.hpp:437
bool has_input(name_t name) const
bool has_output(name_t name) const
any_regular_t inspect(const array_t &expression)
dictionary_t contributing_to_cell(name_t) const
void set(const dictionary_t &dictionary)
void add_invariant(name_t name, const line_position_t &position, const array_t &expression)
void add_interface(name_t name, any_regular_t initial)
connection_t monitor_value(name_t name, const monitor_value_t &proc)
void touch(const name_t *first, const name_t *last)
const any_regular_t & operator[](name_t cell) const
std::function< void(const any_regular_t &)> monitor_value_t
Definition adam.hpp:61
void add_relation(const line_position_t &position, const array_t &conditional, const relation_t *first, const relation_t *last)
void add_constant(name_t name, any_regular_t value)
void add_logic(name_t name, const line_position_t &position, const array_t &expression)
void add_interface(name_t name, bool linked, const line_position_t &position1, const array_t &initializer, const line_position_t &position2, const array_t &expression)
dictionary_t contributing(const dictionary_t &mark) const
connection_t monitor_invariant_dependent(name_t output, const monitor_invariant_t &proc)
boost::signals2::connection connection_t
Definition adam.hpp:78
std::function< void(bool)> monitor_enabled_t
Definition adam.hpp:63
void set(name_t cell, const any_regular_t &value)
connection_t monitor_enabled(name_t cell, const name_t *first, const name_t *last, const monitor_enabled_t &proc)
std::function< void(const dictionary_t &)> monitor_contributing_t
Definition adam.hpp:62
void reinitialize()
dictionary_t contributing() const
void add_output(name_t name, const line_position_t &position, const array_t &expression)
any_regular_t get(name_t cell)
std::function< void(bool)> monitor_invariant_t
Definition adam.hpp:60
virtual_machine_t machine_m
Definition adam.hpp:510
void add_constant(name_t name, const line_position_t &position, const array_t &initializer)
A runtime polymorphic type similar to boost::any which can hold any type which models Regular.
Stack-based non-branching expression evaluator.
closed_hash_map< name_t, any_regular_t > dictionary_t
std::vector< any_regular_t > array_t
Definition array_fwd.hpp:23
STL namespace.
A type detailing parser position information.
Definition istream.hpp:127
A character string class for immutable strings.
Definition name.hpp:220
void operator()(const any_regular_t &x)
Definition adam.hpp:528
set_monitor_t(sheet_t &sheet, name_t cell_name)
Definition adam.hpp:526
Adam support class for related relationships.
Definition adam.hpp:546
line_position_t position_m
Definition adam.hpp:570
relation_t & operator=(relation_t x)
Definition adam.hpp:563
friend void swap(relation_t &x, relation_t &y)
Definition adam.hpp:551
relation_t(relation_t &&x) noexcept
Definition adam.hpp:557
relation_t(const relation_t &)=default
std::vector< name_t > name_set_m
Definition adam.hpp:569
relation_t(std::vector< name_t > n, line_position_t p, array_t e)
Definition adam.hpp:548