Subversion Repositories gelsvn

Rev

Rev 512 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* Written by Christian Thode Larsen 2009-2010
* Contact: thode2d@gmail.com
* Based on original work by J. Andreas Baerentzen
* Inspired by OpenMesh (www.openmesh.org)
*/

#ifndef __HMESH_ATTRIBUTEVECTOR_H__
#define __HMESH_ATTRIBUTEVECTOR_H__

#include <vector>
#include <map>

#include "Manifold.h"

namespace HMesh
{
        // IndexRemap used for the cleanup function, whenever the manifold is cleaned
    typedef std::map<int, int> IndexRemap;

        template<typename ITEM, typename ITEMID>
        class AttributeVector
        {
        public:
                AttributeVector(IndexType _size, ITEM item = ITEM());

                ITEMID add(const ITEM& item);

        // just returning should be ok; manifold and attribs should always be in sync.
        // const context means manifold and attribs should be const, hence in sync.
        const ITEM& get(ITEMID id) const;
        ITEM& get(ITEMID id);

                const ITEM& operator [](ITEMID id) const;
                ITEM& operator [](ITEMID id);

                void resize(IndexType _size, ITEM item = ITEM());

        private:
                std::vector<ITEM> items;
        };

        template<typename ITEM>
        class VertexAttributeVector : public AttributeVector<ITEM, VertexID>
        {
        public:
                VertexAttributeVector(const Manifold& m, ITEM item = ITEM());
        };

        template<typename ITEM>
        class FaceAttributeVector : public AttributeVector<ITEM, FaceID>
        {
        public:
                FaceAttributeVector(const Manifold& m, ITEM item = ITEM());
        };

        template<typename ITEM>
        class HalfEdgeAttributeVector : public AttributeVector<ITEM, HalfEdgeID>
        {
        public:
                HalfEdgeAttributeVector(const Manifold& m, ITEM item = ITEM());
        };

        template<typename ITEM>
        inline VertexAttributeVector<ITEM>::VertexAttributeVector(const Manifold& m, ITEM item) : AttributeVector<ITEM, VertexID>(m.no_vertices(false), item){}
                
        template<typename ITEM>
        inline FaceAttributeVector<ITEM>::FaceAttributeVector(const Manifold& m, ITEM item) : AttributeVector<ITEM, FaceID>(m.no_faces(false), item){}
                
        template<typename ITEM>
        inline HalfEdgeAttributeVector<ITEM>::HalfEdgeAttributeVector(const Manifold& m, ITEM item) : AttributeVector<ITEM, HalfEdgeID>(m.no_halfedges(false), item){}

        template<typename ITEM, typename ITEMID>
        inline AttributeVector<ITEM, ITEMID>::AttributeVector(IndexType _size, ITEM item) : items(_size, item){}

        template<typename ITEM, typename ITEMID>
        inline void AttributeVector<ITEM, ITEMID>::resize(IndexType _size, ITEM item)
        { items.resize(_size, item); }

        template<typename ITEM, typename ITEMID>
        inline ITEMID AttributeVector<ITEM, ITEMID>::add(const ITEM& item)
        { items.push_back(item); return items.size() - 1; }

        template<typename ITEM, typename ITEMID>
        inline const ITEM& AttributeVector<ITEM, ITEMID>::get(ITEMID id) const
    { return items[id.idx()]; }

        template<typename ITEM, typename ITEMID>
    inline ITEM& AttributeVector<ITEM, ITEMID>::get(ITEMID id)
    {
                if(items.size() < id.idx())
                        items.resize(id.idx() + 1);
                return items[id.idx()]; 
    }
        
        template<typename ITEM, typename ITEMID>
        inline const ITEM& AttributeVector<ITEM, ITEMID>::operator [](ITEMID id) const
    { return items[id.idx()]; }

        template<typename ITEM, typename ITEMID>
    inline ITEM& AttributeVector<ITEM, ITEMID>::operator [](ITEMID id)
    {
                if(items.size() < id.idx())
                        items.resize(id.idx() + 1);
                return items[id.idx()]; 
    }
}

#endif

Generated by GNU Enscript 1.6.6.