#ifndef SIMGEAR_EXTENDEDPROPERTYADAPTER_HXX #define SIMGEAR_EXTENDEDPROPERTYADAPTER_HXX 1 #include #include #include #include #include "props.hxx" namespace simgear { namespace props { // This should be in simgear/math/SGVec.hxx and friends template struct NumComponents; template<> struct NumComponents { enum { num_components = 3 }; }; template<> struct NumComponents { enum { num_components = 4 }; }; } template class ExtendedPropertyAdapter { public: enum { num_components = props::NumComponents::num_components }; ExtendedPropertyAdapter(const NodeContainer& elements) : _elements(elements) { } T operator()() const { T result; if (_elements.size() < num_components) throw sg_exception(); for (int i = 0; i < num_components; ++i) result[i] = _elements[i]->template getValue(); return result; } void set(const T& val) { if (_elements.size() < num_components) throw sg_exception(); for (int i = 0; i < num_components; ++i) _elements[i]->setValue(val[i]); } private: const NodeContainer& _elements; }; template inline void makeChildList(SGPropertyNode* prop, InIterator inBegin, InIterator inEnd, OutIterator outBegin) { std::transform(inBegin, inEnd, outBegin, boost::bind(static_cast(&SGPropertyNode::getChild), prop, _1, 0, true)); } } #endif