libqi-api  2.4.3.28
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
property.hpp
Go to the documentation of this file.
1 #pragma once
2 /*
3 ** Copyright (C) 2013 Aldebaran Robotics
4 ** See COPYING for the license
5 */
6 
7 #ifndef _QI_PROPERTY_HPP_
8 #define _QI_PROPERTY_HPP_
9 
10 #include <boost/function.hpp>
11 #include <qi/signal.hpp>
12 
13 #ifdef _MSC_VER
14 # pragma warning( push )
15  // needs to have dll-interface to be used by clients
16 # pragma warning( disable: 4251 )
17  // non dll-interface class * used as base for dll-interface class
18 # pragma warning( disable: 4275 )
19 #endif
20 
21 namespace qi
22 {
23 
27  {
28  public:
29  virtual ~PropertyBase() {}
30  virtual SignalBase* signal() = 0;
31  virtual void setValue(AutoAnyReference value) = 0;
32  virtual AnyValue value() const = 0;
33  };
34 
35  template<typename T>
36  class PropertyImpl: public SignalF<void(const T&)>, public PropertyBase
37  {
38  public:
42  typedef boost::function<bool (T&, const T&)> Setter;
43  typedef boost::function<T(const T&)> Getter;
45  typedef T PropertyType;
54  PropertyImpl(Getter getter = Getter(), Setter setter = Setter(),
56  virtual ~PropertyImpl() {}
57  T get() const;
58  void set(const T& v);
59  void operator=(const T& v) { set(v); }
60  protected:
63  T _value;
64  };
65 
68  template<typename T>
69  class Property: public PropertyImpl<T>
70  {
71  public:
73  typedef typename ImplType::Getter Getter;
74  typedef typename ImplType::Setter Setter;
75  Property(Getter getter = Getter(), Setter setter = Setter(),
77  : PropertyImpl<T>(getter, setter, onsubscribe)
78  {}
79  Property(AutoAnyReference defaultValue, Getter getter = Getter(), Setter setter = Setter(),
81  : PropertyImpl<T>(getter, setter, onsubscribe)
82  { PropertyImpl<T>::set(defaultValue.to<T>()); }
83  virtual SignalBase* signal() { return this; }
84  virtual void setValue(AutoAnyReference value) { PropertyImpl<T>::set(value.to<T>()); }
85  virtual AnyValue value() const { return AnyValue::from(PropertyImpl<T>::get()); }
86  };
87 
88  template<>
89  class QI_API Property<AnyValue>: public PropertyImpl<AnyValue>
90  {
91  public:
92 
93  Property(Getter getter = Getter(), Setter setter = Setter(),
95  : PropertyImpl<AnyValue>(getter, setter, onsubscribe)
96  {
97  }
98  virtual SignalBase* signal() { return this; }
99  virtual void setValue(AutoAnyReference value) { set(AnyValue(value, false, false)); }
100  virtual AnyValue value() const { return get(); }
101  };
102 
104  class QI_API GenericProperty: public Property<AnyValue>
105  {
106  public:
107  GenericProperty(TypeInterface* type, Getter getter = Getter(), Setter setter = Setter())
108  :Property<AnyValue>(getter, setter)
109  , _type(type)
110  { // Initialize with default value for given type
111  set(AnyValue(_type));
112  std::vector<TypeInterface*> types(&_type, &_type + 1);
113  _setSignature(makeTupleSignature(types));
114  }
115  virtual void setValue(AutoAnyReference value) { set(AnyValue(value, false, false));}
116  void set(const AnyValue& v);
117  virtual qi::Signature signature() const {
118  return makeTupleSignature(std::vector<TypeInterface*>(&_type, &_type + 1));
119  }
120  private:
121  TypeInterface* _type;
122  };
123 
124 
125 }
126 
128 
129 #ifdef _MSC_VER
130 # pragma warning( pop )
131 #endif
132 
133 #endif // _QITYPE_PROPERTY_HPP_
PropertyImpl< T > ImplType
Definition: property.hpp:72
#define QI_API
Definition: api.hpp:34
virtual void setValue(AutoAnyReference value)
Definition: property.hpp:99
Property(AutoAnyReference defaultValue, Getter getter=Getter(), Setter setter=Setter(), SignalBase::OnSubscribers onsubscribe=SignalBase::OnSubscribers())
Definition: property.hpp:79
static AnyValue from(const T &r)
Definition: anyvalue.hpp:87
virtual SignalBase * signal()
Definition: property.hpp:83
virtual qi::Signature signature() const
Definition: property.hpp:117
virtual AnyValue value() const
Definition: property.hpp:100
T to() const
Convert to anything or throw trying.
Property(Getter getter=Getter(), Setter setter=Setter(), SignalBase::OnSubscribers onsubscribe=SignalBase::OnSubscribers())
Definition: property.hpp:93
GenericProperty(TypeInterface *type, Getter getter=Getter(), Setter setter=Setter())
Definition: property.hpp:107
virtual ~PropertyImpl()
Definition: property.hpp:56
Type-erased property, simulating a typed property but using AnyValue.
Definition: property.hpp:104
PropertyImpl(Getter getter=Getter(), Setter setter=Setter(), SignalBase::OnSubscribers onsubscribe=SignalBase::OnSubscribers())
Definition: property.hxx:26
Property(Getter getter=Getter(), Setter setter=Setter(), SignalBase::OnSubscribers onsubscribe=SignalBase::OnSubscribers())
Definition: property.hpp:75
virtual void setValue(AutoAnyReference value)
Definition: property.hpp:84
qi::Signature makeTupleSignature(const std::vector< qi::AnyReference > &vgv, bool resolveDynamic=false, const std::string &name=std::string(), const std::vector< std::string > &names=std::vector< std::string >())
ImplType::Getter Getter
Definition: property.hpp:73
SignalF< void(const T &)> SignalType
Definition: property.hpp:44
boost::function< void(bool)> OnSubscribers
Definition: signal.hpp:41
void operator=(const T &v)
Definition: property.hpp:59
virtual SignalBase * signal()
Definition: property.hpp:98
ImplType::Setter Setter
Definition: property.hpp:74
virtual AnyValue value() const
Definition: property.hpp:85
virtual ~PropertyBase()
Definition: property.hpp:29
virtual void setValue(AutoAnyReference value)
Definition: property.hpp:115
boost::function< T(const T &)> Getter
Definition: property.hpp:43
boost::function< bool(T &, const T &)> Setter
Definition: property.hpp:42
void set(const T &v)
Definition: property.hxx:43