Boost logo

Boost :

From: Simonson, Lucanus J (lucanus.j.simonson_at_[hidden])
Date: 2007-10-10 18:30:16


Fernando wrote:
>What would I need to do in GTL?
>And, MORE importantly, what does GTL do, exactly, to adapt my "p" objet
>there?

Just typing off the top of my head. I am not yet allowed to copy and
paste the code I wrote which Intel owns.

typedef int Unit;

struct MyPoint {int x, int y};

template <>
class PointConceptMap<MyPoint> {
public:
        static inline Unit PointGet(const MyPoint& t, Orientation2D
orient) {
                return orient == HORIZONTAL ? t.x: t.y; }

        static inline void PointSet(MyPoint& t, Orientation2D orient,
                                                Unit value) {
        if(orient == HORIZONTAL) t.x = value; else t.y = value; }

        static inline MyPoint PointConstruct(Unit x, Unit y) {
                MyPoint tmp; tmp.x = x; tmp.y = y; return tmp; }
private:
        PointConceptMap(); //construction disallowed
}

template <class T>
class PointConcept : public T {
public:
        static inline PointConcept& mimic(T& t) {
                return static_cast<PointConcept&>(t); }
        static inline const PointConcept& mimicConst(T& t) {
                return static_cast<const PointConcept&>(t); }
        inline T& yield() { return *this; }
        inline const T& yieldConst() { return *this; }

        inline PointConcept() {}

        template <class T2>
        inline PointConcept& operator=(PointConcept<T2>& that) {
                set(HORIZONTAL, that.get(HORIZONTAL);
                return set(VERTICAL, that.get(VERTICAL); }

        Unit get(Orientation2D orient) const { return get_(orient); }
        PointConcept& set(Orientation2D orient, Unit value) {
                set_(orient, value); return *this; }

private:
        inline Unit get_(Orientation2D orient) const {
                return PointConceptMap<T>::PointGet(yieldConst(),
orient); }
        inline void set_(Orientation2D orient, Unit value) {
                PointConceptMap<T>::PointSet(yield(), orient, value); }
        static inline T construct_(Unit x, Unit y) {
                return PointConceptMap<T>::PointConstruct(x, y); }
};

template <class T>
void foo(T& t) {
        PointConcept<T>& tref = PointConcept<T>::mimic(t);
        tref.set(HORIZONTAL, tref.get(VERTICAL);
}

That is the complete design pattern. It probably has syntax errors
because I was typing off the top of my head, but you should get the idea
quite clearly.

Luke


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk