fw4spl
SrcLib/core/fwData/include/fwData/GenericField.hpp
1 /* ***** BEGIN LICENSE BLOCK *****
2  * FW4SPL - Copyright (C) IRCAD, 2009-2017.
3  * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
4  * published by the Free Software Foundation.
5  * ****** END LICENSE BLOCK ****** */
6 
7 #ifndef __FWDATA_GENERICFIELD_HPP__
8 #define __FWDATA_GENERICFIELD_HPP__
9 
10 #include "fwData/config.hpp"
11 #include "fwData/factory/new.hpp"
12 #include "fwData/GenericFieldBase.hpp"
13 
14 #include <fwCore/base.hpp>
15 
16 #include <boost/lexical_cast.hpp>
17 
18 #include <string>
19 
20 namespace fwData
21 {
22 
30 template< typename T >
31 class FWDATA_CLASS_API GenericField : public GenericFieldBase
32 {
33 
34 public:
36 
37  typedef T ValueType;
38 
40  T& value() noexcept
41  {
42  return m_value;
43  }
44 
46  const T& value() const noexcept
47  {
48  return m_value;
49  }
50 
52  void setValue(const T& newValue) noexcept
53  {
54  m_value = newValue;
55  }
56 
58  T getValue() const noexcept
59  {
60  return m_value;
61  }
62 
64  operator T() noexcept { return m_value; }
65 
66  //------------------------------------------------------------------------------
67 
68  bool operator== (const GenericFieldBase& lf) override
69  {
70  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
71  SLM_ASSERT("GenericField must have same ValueType.", &gField );
72  return ( this->m_value == gField.value() );
73  }
74 
75  //------------------------------------------------------------------------------
76 
77  bool operator!= (const GenericFieldBase& lf ) override
78  {
79  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
80  SLM_ASSERT("GenericField must have same ValueType.", &gField);
81  return ( this->m_value != gField.value() );
82  }
83 
84  //------------------------------------------------------------------------------
85 
86  bool operator< (const GenericFieldBase& lf ) override
87  {
88  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
89  SLM_ASSERT("GenericField must have same ValueType.", &gField);
90  return ( this->m_value < gField.value() );
91  }
92 
93  //------------------------------------------------------------------------------
94 
95  bool operator> (const GenericFieldBase& lf) override
96  {
97  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
98  SLM_ASSERT("GenericField must have same ValueType.", &gField);
99  return ( this->m_value > gField.value() );
100  }
101 
102  //------------------------------------------------------------------------------
103 
104  bool operator<= (const GenericFieldBase& lf) override
105  {
106  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
107  SLM_ASSERT("GenericField must have same ValueType.", &gField);
108  return ( this->m_value <= gField.value() );
109  }
110 
111  //------------------------------------------------------------------------------
112 
113  bool operator>= (const GenericFieldBase& lf ) override
114  {
115  const ::fwData::GenericField<T>& gField = dynamic_cast< const ::fwData::GenericField<T>& >(lf);
116  SLM_ASSERT("GenericField must have same ValueType.", &gField);
117  return ( this->m_value >= gField.value() );
118  }
119 
120  //------------------------------------------------------------------------------
121 
122  virtual ::std::string toString() const override
123  {
124  return ::boost::lexical_cast< ::std::string >(this->m_value);
125  }
126 
127  //------------------------------------------------------------------------------
128 
129  virtual void fromString(const ::std::string& _value) override
130  {
131  this->m_value = ::boost::lexical_cast< T >(_value);
132  }
133 
134 protected:
135 
136  template< typename GT >
137  static typename GT::sptr GenericFieldFactory(const typename GT::ValueType value);
138 
139  static sptr GenericFieldFactory(const T value);
140 
145  GenericField( const T value = T( ) ) noexcept :
146  m_value( value )
147  {
148  }
149 
153  virtual ~GenericField() noexcept
154  {
155  }
156 
157  //------------------------------------------------------------------------------
158 
159  virtual std::ostream& toOStream( std::ostream& _os ) const override
160  {
161  return _os << this->value();
162  }
163 
166 };
167 
168 //------------------------------------------------------------------------------
169 
170 template< typename T >
171 template< typename GT >
172 typename GT::sptr GenericField<T>::GenericFieldFactory(const typename GT::ValueType value)
173 {
174  typename GT::sptr field;
175  field = ::fwData::factory::New< GT >();
176  field->value() = value;
177  return field;
178 }
179 
180 //------------------------------------------------------------------------------
181 
182 template< typename T >
183 typename GenericField<T>::sptr GenericField<T>::GenericFieldFactory(const T value)
184 {
185  typename GenericField<T>::sptr field;
186  field = GenericFieldFactory< GenericField<T> >(value);
187  field->value() = value;
188  return field;
189 }
190 
191 } // namespace fwData
192 
193 #endif // __FWDATA_GENERICFIELD_HPP__
194 
#define fwCoreNonInstanciableClassDefinitionsMacro(_classinfo_)
Generate common code for Non Instanciable classes (Interfaces, Abstract classes, ...)
GenericField(const T value=T()) noexcept
Constructor.
const T & value() const noexcept
Get the value (constant version).
T & value() noexcept
Get the value (mutable version).
GenericFieldBase define common operation on simple data.
#define SLM_ASSERT(message, cond)
work like &#39;assert&#39; from &#39;cassert&#39;, with in addition a message logged by spylog (with FATAL loglevel) ...
Definition: spyLog.hpp:308
Base class for each data object.
void setValue(const T &newValue) noexcept
set the value
Contains the representation of the data objects used in the framework.