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.