@@ -28,28 +28,53 @@
namespace render {
class Varying ;
template <class T > void varyingGet (const T& data, uint8_t index, Varying& var) {}
template <class T > uint8_t varyingLength (const T& data) { return 0 ; }
// A varying piece of data, to be used as Job/Task I/O
// TODO: Task IO
class Varying {
public:
Varying () {}
Varying (const Varying& var) : _concept(var._concept) {}
Varying& operator =(const Varying& var) {
_concept = var._concept ;
return (*this );
}
template <class T > Varying (const T& data) : _concept(std::make_shared<Model<T>>(data)) {}
template <class T > T& edit () { return std::static_pointer_cast<Model<T>>(_concept)->_data ; }
template <class T > const T& get () const { return std::static_pointer_cast<const Model<T>>(_concept)->_data ; }
// access potential sub varyings contained in this one.
Varying operator [] (uint8_t index) const { return (*_concept)[index ]; }
uint8_t length () const { return _concept->length (); }
protected:
class Concept {
public:
virtual ~Concept () = default ;
virtual Varying operator [] (uint8_t index) const = 0 ;
virtual uint8_t length () const = 0;
};
template <class T > class Model : public Concept {
public:
using Data = T;
Model (const Data& data) : _data(data) {}
virtual ~Model () = default ;
virtual Varying operator [] (uint8_t index) const {
Varying var;
varyingGet<T>(_data, index , var);
return var;
}
virtual uint8_t length () const { return varyingLength<T>(_data); }
Data _data;
};
@@ -58,20 +83,82 @@ class Varying {
};
using VaryingPair = std::pair<Varying, Varying>;
/*
class VaryingPairBase {
public:
Varying first;
Varying second;
// template < class T0, class T1> VaryingPairBase() : Parent(Varying(T0()), Varying(T1())) {}
// VaryingPairBase(const VaryingPairBase& pair) : Parent(pair.first, pair.second) {}
VaryingPairBase(const Varying& _first, const Varying& _second) : first(_first), second(_second) {}
};
*/ /*
template < class T0, class T1 >
class VaryingPair : public std::pair<Varying, Varying> {
public:
using Parent = std::pair<Varying, Varying>;
VaryingPair () : Parent(Varying(T0()), T1()) {}
VaryingPair() : Parent(Varying(T0()), Varying(T1())) {}
VaryingPair(const VaryingPair& pair) : Parent(pair.first, pair.second) {}
VaryingPair(const Varying& first, const Varying& second) : Parent(first, second) {}
const T0& getFirst() const { return first.get<T0>(); }
T0& editFirst() { return first.edit<T0>(); }
const T1& getSecond() const { return second.get<T1>(); }
T1& editSecond() { return second.edit<T1>(); }
};
*/
template <> void varyingGet (const VaryingPair& data, uint8_t index, Varying& var);
template <> uint8_t varyingLength (const VaryingPair& data);
/* template <class T> Varying varyingGet(const T& data, uint8_t index) {
return Varying(T());
}*/
// template <T0, T1> Varying varyingGet(template VaryingPair<T0, T1>& data, uint8_t index);
// template <> uint8_t varyingLength(template VaryingPair<T0, T1>& data);
/*
template < class T0, class T1 >
class VaryingPair : Varying {
public:
using Parent = Varying;
using Pair = std::pair<Varying, Varying>;
VaryingPair() : Parent(Pair(Varying(T0()), Varying(T1()))) {}
VaryingPair(const Varying& first, const Varying& second) : Parent(Pair(first, second)) {}
Pair& editPair() { return edit<Pair>(); }
const Pair& getPair() const { return get<Pair>(); }
const T0& getFirst() const { return getPair().first.template get<T0>(); }
T0& editFirst() { return editPair().first.template edit<T0>(); }
const T1& getSecond() const { return getPair().second.template get<T1>(); }
T1& editSecond() { return editPair().second.template edit<T1>(); }
// access potential sub varyings contained in this one.
virtual Varying operator[] (uint8_t index) const {
if (index == 0) {
return getPair().first;
} else {
return getPair().second;
} }
virtual uint8_t length() const { return 2; }
};
*/
template < class T , int NUM >
class VaryingArray : public std ::array<Varying, NUM> {
public: