]> git.mxchange.org Git - flightgear.git/blob - src/Environment/tiedpropertylist.hxx
#84: John Denker: Set correct file modes
[flightgear.git] / src / Environment / tiedpropertylist.hxx
1 #ifndef __TIEDPROPERTYLIST_HXX
2 #define  __TIEDPROPERTYLIST_HXX
3 #include <simgear/props/props.hxx>
4 using simgear::PropertyList;
5
6 // Maybe this goes into SimGear's props.hxx later?
7 class TiedPropertyList : PropertyList {
8 public:
9     TiedPropertyList() {}
10     TiedPropertyList( SGPropertyNode_ptr root ) { _root = root; }
11
12     void setRoot( SGPropertyNode_ptr root ) { _root = root; }
13     SGPropertyNode_ptr getRoot() const { return _root; }
14
15     template<typename T> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, const SGRawValue<T> &rawValue, bool useDefault = true  ) {
16         bool success = node->tie( rawValue, useDefault );
17         if( success ) {
18             SG_LOG( SG_ALL, SG_INFO, "Tied " << node->getPath() );
19             push_back( node );
20         } else {
21 #if PROPS_STANDALONE
22             cerr << "Failed to tie property " << node->getPath() << endl;
23 #else
24             SG_LOG(SG_GENERAL, SG_WARN, "Failed to tie property " << node->getPath() );
25 #endif
26         }
27         return node;
28     }
29
30     template <class V> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, V * value, bool useDefault = true ) {
31         return Tie( node, SGRawValuePointer<V>(value), useDefault );
32     }
33
34     template <class V> SGPropertyNode_ptr Tie( const char * relative_path, V * value, bool useDefault = true ) {
35         return Tie( _root->getNode(relative_path,true), SGRawValuePointer<V>(value), useDefault );
36     }
37
38     template <class V> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, V (*getter)(), void (*setter)(V) = 0, bool useDefault = true ) {
39         return Tie(node, SGRawValueFunctions<V>(getter, setter), useDefault );
40     }
41
42     template <class V> SGPropertyNode_ptr Tie( const char * relative_path, V (*getter)(), void (*setter)(V) = 0, bool useDefault = true ) {
43         return Tie(_root->getNode(relative_path, true), SGRawValueFunctions<V>(getter, setter), useDefault );
44     }
45
46     template <class V> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, int index, V (*getter)(int), void (*setter)(int, V) = 0, bool useDefault = true) {
47         return Tie( node, SGRawValueFunctionsIndexed<V>(index, getter, setter), useDefault );
48     }
49
50     template <class V> SGPropertyNode_ptr Tie( const char * relative_path, int index, V (*getter)(int), void (*setter)(int, V) = 0, bool useDefault = true) {
51         return Tie( _root->getNode( relative_path, true ), SGRawValueFunctionsIndexed<V>(index, getter, setter), useDefault );
52     }
53
54     template <class T, class V> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, T * obj, V (T::*getter)() const, void (T::*setter)(V) = 0, bool useDefault = true) {
55         return Tie( node, SGRawValueMethods<T,V>(*obj, getter, setter), useDefault );
56     }
57
58     template <class T, class V> SGPropertyNode_ptr Tie( const char * relative_path, T * obj, V (T::*getter)() const, void (T::*setter)(V) = 0, bool useDefault = true) {
59         return Tie( _root->getNode( relative_path, true), SGRawValueMethods<T,V>(*obj, getter, setter), useDefault );
60     }
61
62     template <class T, class V> SGPropertyNode_ptr Tie( SGPropertyNode_ptr node, T * obj, int index, V (T::*getter)(int) const, void (T::*setter)(int, V) = 0, bool useDefault = true) {
63         return Tie( node, SGRawValueMethodsIndexed<T,V>(*obj, index, getter, setter), useDefault);
64     }
65
66     template <class T, class V> SGPropertyNode_ptr Tie( const char * relative_path, T * obj, int index, V (T::*getter)(int) const, void (T::*setter)(int, V) = 0, bool useDefault = true) {
67         return Tie( _root->getNode( relative_path, true ), SGRawValueMethodsIndexed<T,V>(*obj, index, getter, setter), useDefault);
68     }
69
70     void Untie() {
71         while( size() > 0 ) {
72             SG_LOG( SG_ALL, SG_INFO, "untie of " << back()->getPath() );
73             back()->untie();
74             pop_back();
75         }
76     }
77 private:
78     SGPropertyNode_ptr _root;
79 };
80 #endif