[DEV] better property (simplify and remove stupid comportment

This commit is contained in:
Edouard DUPIN 2016-02-24 22:27:54 +01:00
parent 08b1222922
commit 28ce277bba
4 changed files with 122 additions and 89 deletions

View File

@ -14,11 +14,11 @@
#include <typeinfo> #include <typeinfo>
namespace eproperty { namespace eproperty {
template<typename MY_TYPE> class List : public Property { template<typename TYPE> class List : public Property {
private: private:
MY_TYPE m_value; //!< Element value ==> can be directly used. TYPE m_value; //!< Element value ==> can be directly used.
MY_TYPE m_default; //!< Default value. TYPE m_default; //!< Default value.
std::map<std::string, MY_TYPE> m_list; //!< pointer on the list of all elements. std::map<std::string, TYPE> m_list; //!< pointer on the list of all elements.
public: public:
/** /**
* @brief Create a parameter with List of element parameter. * @brief Create a parameter with List of element parameter.
@ -28,7 +28,7 @@ namespace eproperty {
*/ */
List(eproperty::Interface& _paramInterfaceLink, List(eproperty::Interface& _paramInterfaceLink,
const std::string& _name, const std::string& _name,
const MY_TYPE& _defaultValue, const TYPE& _defaultValue,
const std::string& _description="") : const std::string& _description="") :
Property(_paramInterfaceLink, _name), Property(_paramInterfaceLink, _name),
m_value(_defaultValue), m_value(_defaultValue),
@ -39,7 +39,7 @@ namespace eproperty {
* @brief Destructor. * @brief Destructor.
*/ */
virtual ~List() = default; virtual ~List() = default;
void add(const MY_TYPE& _value, const std::string& _name, const std::string& _description = "") { void add(const TYPE& _value, const std::string& _name, const std::string& _description = "") {
auto it = m_list.find(_name); auto it = m_list.find(_name);
if (it != m_list.end()) { if (it != m_list.end()) {
it->second = _value; it->second = _value;
@ -53,7 +53,7 @@ namespace eproperty {
} }
// herited methode // herited methode
virtual std::string getType() const { virtual std::string getType() const {
return typeid(MY_TYPE).name(); return typeid(TYPE).name();
} }
// herited methode // herited methode
virtual std::string getString() const { virtual std::string getString() const {
@ -94,24 +94,21 @@ namespace eproperty {
virtual void setDefault() { virtual void setDefault() {
set(m_default); set(m_default);
} }
void setDefaultValue(const MY_TYPE& _value) { void setDefaultValue(const TYPE& _value) {
m_default = _value; m_default = _value;
} }
/** /**
* @brief Get the value of the current parameter. * @brief Get the value of the current parameter.
* @return the Reference value * @return the Reference value
*/ */
inline MY_TYPE& get() { const inline TYPE& get() const {
return m_value;
};
const inline MY_TYPE& get() const {
return m_value; return m_value;
}; };
/** /**
* @brief Set the value of the current parameter. * @brief Set the value of the current parameter.
* @param[in] _newVal New value of the parameter. (not set if out of range) * @param[in] _newVal New value of the parameter. (not set if out of range)
*/ */
void set(MY_TYPE _newVal) { void set(TYPE _newVal) {
if (_newVal == m_value) { if (_newVal == m_value) {
return; return;
} }
@ -124,13 +121,33 @@ namespace eproperty {
} }
EPROPERTY_WARNING("paramList value=??? is not un the list ... ==> no change"); EPROPERTY_WARNING("paramList value=??? is not un the list ... ==> no change");
} }
/**
* @brief Set the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @param[in] newVal New value to set
*/
inline void setDirect(const TYPE& _newVal) {
m_value = _newVal;
};
/**
* @brief Get the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @return a reference on the value
*/
TYPE& getDirect() {
return m_value;
}
private: private:
/** /**
* @brief Get the element description from real Value. * @brief Get the element description from real Value.
* @param[in] _intValue value that might be converted in string. * @param[in] _intValue value that might be converted in string.
* @return the description string coresponding to this ID. * @return the description string coresponding to this ID.
*/ */
std::string getElement(MY_TYPE _intValue) const { std::string getElement(TYPE _intValue) const {
for (auto &it : m_list) { for (auto &it : m_list) {
if (it.second == _intValue) { if (it.second == _intValue) {
return it.first; return it.first;
@ -139,28 +156,18 @@ namespace eproperty {
return "???"; return "???";
} }
public: public:
/** const List<TYPE>& operator= (const TYPE& _newVal) = delete;
* @brief assignement operator. operator const TYPE&() const {
* @param[in] newVal The new value of the parameter.
*/
const List& operator= (MY_TYPE _newVal) {
set(_newVal);
return *this;
}
operator const MY_TYPE&() const {
return m_value; return m_value;
} }
MY_TYPE& operator *() const noexcept { const TYPE& operator *() const noexcept {
return m_value; return m_value;
} }
const MY_TYPE* operator->() const noexcept { const TYPE* operator->() const noexcept {
return &m_value;
}
MY_TYPE* operator->() noexcept {
return &m_value; return &m_value;
} }
}; };
template<typename MY_TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::List<MY_TYPE>& _obj) { template<typename TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::List<TYPE>& _obj) {
_os << _obj.get(); _os << _obj.get();
return _os; return _os;
} }

View File

@ -70,6 +70,19 @@ namespace eproperty {
* @brief Reset the value to the default value. * @brief Reset the value to the default value.
*/ */
virtual void setDefault() = 0; virtual void setDefault() = 0;
public:
template<class TYPE>
bool operator== (const TYPE& _obj) const = delete;
template<class TYPE>
bool operator!= (const TYPE& _obj) const = delete;
template<class TYPE>
bool operator<= (const TYPE& _obj) const = delete;
template<class TYPE>
bool operator>= (const TYPE& _obj) const = delete;
template<class TYPE>
bool operator< (const TYPE& _obj) const = delete;
template<class TYPE>
bool operator> (const TYPE& _obj) const = delete;
}; };
class Ref { class Ref {
public: public:

View File

@ -12,12 +12,12 @@
#include <typeinfo> #include <typeinfo>
namespace eproperty { namespace eproperty {
template<typename MY_TYPE> class Range : public Property { template<typename TYPE> class Range : public Property {
private: private:
MY_TYPE m_value; //!< Current value. TYPE m_value; //!< Current value.
MY_TYPE m_min; //!< Minimum value. TYPE m_min; //!< Minimum value.
MY_TYPE m_max; //!< Maximum value. TYPE m_max; //!< Maximum value.
MY_TYPE m_default; //!< Default value. TYPE m_default; //!< Default value.
public: public:
/** /**
* @brief Create a parameter with a specific type. * @brief Create a parameter with a specific type.
@ -30,9 +30,9 @@ namespace eproperty {
*/ */
Range(eproperty::Interface& _paramInterfaceLink, Range(eproperty::Interface& _paramInterfaceLink,
const std::string& _name, const std::string& _name,
const MY_TYPE& _defaultValue, const TYPE& _defaultValue,
const MY_TYPE& _min, const TYPE& _min,
const MY_TYPE& _max, const TYPE& _max,
const std::string& _description = "") : const std::string& _description = "") :
Property(_paramInterfaceLink, _name), Property(_paramInterfaceLink, _name),
m_value(_defaultValue), m_value(_defaultValue),
@ -51,7 +51,7 @@ namespace eproperty {
} }
// herited methode // herited methode
virtual std::string getType() const { virtual std::string getType() const {
return typeid(MY_TYPE).name(); return typeid(TYPE).name();
} }
// herited methode // herited methode
virtual std::string getString() const { virtual std::string getString() const {
@ -63,7 +63,7 @@ namespace eproperty {
}; };
// herited methode // herited methode
virtual void setString(const std::string& _newVal) { virtual void setString(const std::string& _newVal) {
MY_TYPE val; TYPE val;
// when you want to set an element in parameter you will implement the function template std::from_string // when you want to set an element in parameter you will implement the function template std::from_string
etk::from_string(val, _newVal); etk::from_string(val, _newVal);
set(val); set(val);
@ -83,65 +83,71 @@ namespace eproperty {
public: public:
/** /**
* @brief Get the value of the current parameter. * @brief Get the value of the current parameter.
* @note For performence, this function must be inline * @return The reference value
* @return the Reference value
*/ */
inline MY_TYPE& get() { const inline TYPE& get() const {
return m_value;
};
const inline MY_TYPE& get() const {
return m_value; return m_value;
}; };
/** /**
* @brief Set a new value for this parameter * @brief Set a new value for this parameter
* @param[in] newVal New value to set (set the nearest value if range is set) * @param[in] newVal New value to set (set the nearest value if range is set)
*/ */
void set(const MY_TYPE& _newVal) { void set(const TYPE& _newVal) {
if (m_min == m_max) { if (m_min == m_max) {
if (_newVal != m_value) { if (_newVal != m_value) {
m_value = _newVal; m_value = _newVal;
notifyChange(); notifyChange();
} }
} else { } else {
MY_TYPE newVal = std::avg(m_min, _newVal, m_max); TYPE newVal = std::avg(m_min, _newVal, m_max);
if (newVal != m_value) { if (newVal != m_value) {
m_value = newVal; m_value = newVal;
notifyChange(); notifyChange();
} }
} }
} }
/**
* @brief Set the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @param[in] newVal New value to set
*/
inline void setDirect(const TYPE& _newVal) {
m_value = _newVal;
};
/**
* @brief Get the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @return a reference on the value
*/
TYPE& getDirect() {
return m_value;
}
private: private:
/** /**
* @brief Get the string of the specify value. * @brief Get the string of the specify value.
* @return convetion of the velue in string. * @return convetion of the velue in string.
*/ */
std::string getValueSpecific(const MY_TYPE& _valueRequested) const { std::string getValueSpecific(const TYPE& _valueRequested) const {
return etk::to_string(_valueRequested); return etk::to_string(_valueRequested);
} }
public: public:
/** const Range<TYPE>& operator= (const TYPE& _newVal) = delete;
* @brief assignement operator. operator const TYPE&() const {
* @param[in] newVal The new value of the parameter.
*/
const Range<MY_TYPE>& operator= (const MY_TYPE& _newVal) {
set(_newVal);
return *this;
};
operator const MY_TYPE&() const {
return m_value; return m_value;
} }
MY_TYPE& operator *() const noexcept { const TYPE& operator*() const noexcept {
return m_value; return m_value;
} }
const MY_TYPE* operator->() const noexcept { const TYPE* operator->() const noexcept {
return &m_value;
}
MY_TYPE* operator->() noexcept {
return &m_value; return &m_value;
} }
}; };
template<typename MY_TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::Range<MY_TYPE>& _obj) { template<typename TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::Range<TYPE>& _obj) {
_os << _obj.get(); _os << _obj.get();
return _os; return _os;
} }

View File

@ -12,10 +12,10 @@
namespace eproperty { namespace eproperty {
template<typename MY_TYPE> class Value : public Property { template<typename TYPE> class Value : public Property {
private: private:
MY_TYPE m_value; //!< Current value. TYPE m_value; //!< Current value.
MY_TYPE m_default; //!< Default value. TYPE m_default; //!< Default value.
public: public:
/** /**
* @brief Create a parameter with a specific type. * @brief Create a parameter with a specific type.
@ -28,7 +28,7 @@ namespace eproperty {
*/ */
Value(eproperty::Interface& _paramInterfaceLink, Value(eproperty::Interface& _paramInterfaceLink,
const std::string& _name, const std::string& _name,
const MY_TYPE& _defaultValue, const TYPE& _defaultValue,
const std::string& _description = "") : const std::string& _description = "") :
Property(_paramInterfaceLink, _name), Property(_paramInterfaceLink, _name),
m_value(_defaultValue), m_value(_defaultValue),
@ -53,7 +53,7 @@ namespace eproperty {
} }
// herited methode // herited methode
virtual std::string getType() const { virtual std::string getType() const {
return typeid(MY_TYPE).name(); return typeid(TYPE).name();
} }
// herited methode // herited methode
virtual std::string getString() const { virtual std::string getString() const {
@ -88,54 +88,61 @@ namespace eproperty {
* @note For performence, this function must be inline * @note For performence, this function must be inline
* @return the Reference value * @return the Reference value
*/ */
inline MY_TYPE& get() { const inline TYPE& get() const {
return m_value;
};
const inline MY_TYPE& get() const {
return m_value; return m_value;
}; };
/** /**
* @brief Set a new value for this parameter * @brief Set a new value for this parameter
* @param[in] newVal New value to set (set the nearest value if range is set) * @param[in] newVal New value to set (set the nearest value if range is set)
*/ */
void set(const MY_TYPE& _newVal) { void set(const TYPE& _newVal) {
if (_newVal != m_value) { if (_newVal != m_value) {
m_value = _newVal; m_value = _newVal;
notifyChange(); notifyChange();
} }
} }
/**
* @brief Set the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @param[in] newVal New value to set
*/
inline void setDirect(const TYPE& _newVal) {
m_value = _newVal;
}
/**
* @brief Get the value of the current parameter (no check (for internal set with no check).
* @note For performence, this function must be inline
* @note Only use by the owner of the property (can not be check on compile time for now ...)
* TODO: Do it better ... compile check
* @return a reference on the value
*/
TYPE& getDirect() {
return m_value;
}
private: private:
/** /**
* @brief Get the string of the specify value. * @brief Get the string of the specify value.
* @return convetion of the velue in string. * @return convetion of the velue in string.
*/ */
std::string getValueSpecific(const MY_TYPE& _valueRequested) const { std::string getValueSpecific(const TYPE& _valueRequested) const {
return etk::to_string(_valueRequested); return etk::to_string(_valueRequested);
} }
public: public:
/** operator const TYPE&() const {
* @brief assignement operator.
* @param[in] newVal The new value of the parameter.
*/
const Value<MY_TYPE>& operator= (const MY_TYPE& _newVal) {
set(_newVal);
return *this;
};
operator const MY_TYPE&() const {
return m_value; return m_value;
} }
MY_TYPE& operator *() const noexcept { const TYPE& operator *() const noexcept {
return m_value; return m_value;
} }
const MY_TYPE* operator->() const noexcept { const TYPE* operator->() const noexcept {
return &m_value;
}
MY_TYPE* operator->() noexcept {
return &m_value; return &m_value;
} }
const Value<TYPE>& operator= (const TYPE& _newVal) = delete;
}; };
template<typename MY_TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::Value<MY_TYPE>& _obj) { template<typename TYPE> std::ostream& operator <<(std::ostream& _os, const eproperty::Value<TYPE>& _obj) {
_os << _obj.get(); _os << _obj.get();
return _os; return _os;
} }