libqi-api  release-2.5.3-2016-11-18
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
property.hxx
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 _QITYPE_DETAIL_PROPERTY_HXX_
8 #define _QITYPE_DETAIL_PROPERTY_HXX_
9 
10 #include <boost/thread/locks.hpp>
11 #include <qi/future.hpp>
12 
13 namespace qi
14 {
16  {
17  std::pair<AnyReference, bool> conv = v.convert(_type);
18  if (!conv.first.type())
19  throw std::runtime_error(std::string("Failed converting ") + v.type()->infoString() + " to " + _type->infoString());
20 
21  Property<AnyValue>::set(AnyValue(conv.first, false, conv.second));
22 
23  return FutureSync<void>(0);
24  }
25 
26  template<typename T>
28  SignalBase::OnSubscribers onsubscribe)
29  : SignalF<void(const T&)>(std::move(onsubscribe))
30  , _getter(std::move(getter))
31  , _setter(std::move(setter))
32  {
33  }
34 
35  template<typename T>
37  Getter getter, Setter setter,
38  SignalBase::OnSubscribers onsubscribe)
39  : SignalF<void(const T&)>(std::move(onsubscribe))
40  , _getter(std::move(getter))
41  , _setter(std::move(setter))
42  , _value(defaultValue.to<T>())
43  {
44  }
45 
46  template<typename T>
48  {
49  if (_getter)
50  return _getter(_value);
51  else
52  return _value;
53  }
54  template<typename T>
55  void PropertyImpl<T>::setImpl(const T& v)
56  {
57  qiLogDebug("qitype.property") << "set " << this << " " << (!!_setter);
58  if (_setter)
59  {
60  const bool ok = _setter(_value, v);
61  if (ok)
62  (*this)(_value);
63  }
64  else
65  {
66  _value = v;
67  (*this)(_value);
68  }
69  }
70 
71 
72  template<typename T>
74  {
75  return FutureSync<T>(this->getImpl());
76  }
77 
78  template<typename T>
80  {
81  this->setImpl(v);
82  return FutureSync<void>(0);
83  }
84 
85  template<typename T>
87  {
88  return FutureSync<AnyValue>(AnyValue::from(this->getImpl()));
89  }
90 
91  template<typename T>
93  {
94  this->setImpl(value.to<T>());
95  return FutureSync<void>(0);
96  }
97 
98 
99  template<typename T>
101  {
102  boost::mutex::scoped_lock lock(_mutex);
103  return FutureSync<T>(this->getImpl());
104  }
105 
106  template<typename T>
108  {
109  boost::mutex::scoped_lock lock(_mutex);
110  this->setImpl(v);
111  return FutureSync<void>(0);
112  }
113 
114  template<typename T>
116  {
117  boost::mutex::scoped_lock lock(_mutex);
118  return FutureSync<AnyValue>(AnyValue::from(this->getImpl()));
119  }
120 
121  template<typename T>
123  {
124  boost::mutex::scoped_lock lock(_mutex);
125  this->setImpl(value.to<T>());
126  return FutureSync<void>(0);
127  }
128 
129  template<class T>
132  {
133  return ScopedLockReadWrite(*this);
134  }
135 
136  template<class T>
139  {
140  return ScopedLockReadOnly(*this);
141  }
142 }
143 
144 #endif // _QITYPE_DETAIL_PROPERTY_HXX_
FutureSync< AnyValue > value() const override
Definition: property.hxx:115
std::pair< AnyReference, bool > convert(TypeInterface *targetType) const
T getImpl() const
Definition: property.hxx:47
boost::function< void(bool)> OnSubscribers
Definition: signal.hpp:41
FutureSync< void > setValue(AutoAnyReference value) override
Definition: property.hxx:122
ScopedLockReadWrite getLockedReadWrite()
Definition: property.hxx:131
#define qiLogDebug(...)
Definition: log.hpp:68
static AnyValue from(const T &r)
Definition: anyvalue.hpp:90
FutureSync< T > get() const override
Definition: property.hxx:73
FutureSync< void > setValue(AutoAnyReference value) override
Definition: property.hxx:92
T to() const
Convert to anything or throw trying.
boost::function< T(const T &)> Getter
Definition: property.hpp:44
TypeInterface * type() const
FutureSync< void > set(const T &v) override
Definition: property.hxx:107
PropertyImpl(Getter getter=Getter(), Setter setter=Setter(), SignalBase::OnSubscribers onsubscribe=SignalBase::OnSubscribers())
Definition: property.hxx:27
const char * infoString()
FutureSync< void > set(const T &v) override
Definition: property.hxx:79
void setImpl(const T &v)
Definition: property.hxx:55
FutureSync< void > set(const AnyValue &v) override
Definition: property.hxx:15
boost::function< bool(T &, const T &)> Setter
Definition: property.hpp:43
FutureSync< T > get() const override
Definition: property.hxx:100
ScopedLockReadOnly getLockedReadOnly() const
Definition: property.hxx:138
FutureSync< AnyValue > value() const override
Definition: property.hxx:86