00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VRS_VERTEXDATA_H
00019 #define VRS_VERTEXDATA_H
00020
00021
00022 #include <vrs/sharedobj.h>
00023
00024 #include <cassert>
00025
00026 namespace VRS {
00027
00028 template<UINT DIM, typename T>
00029 class VertexData {
00030 public:
00031 VertexData() { assert(DIM > 0); init(0, 0, 0, 0); }
00032 explicit VertexData(T x) { assert(DIM > 0); init(x, 0, 0, 0); }
00033 VertexData(T x, T y) { assert(DIM > 1); init(x, y, 0, 0); }
00034 VertexData(T x, T y, T z) { assert(DIM > 2); init(x, y, z, 0); }
00035 VertexData(T x, T y, T z, T w) { assert(DIM > 3); init(x, y, z, w); }
00036
00037 bool operator==(const VertexData& other) const {
00038
00039
00040 for(UINT i = 0; i < DIM; ++i) {
00041 if(data_[i] != other.data_[i]) { return false; }
00042 }
00043 return true;
00044 }
00045 bool operator!=(const VertexData& other) const { return !operator==(other); }
00046
00047
00048 bool operator<(const VertexData& other) const {
00049
00050
00051 for(UINT i = 0; i < DIM; ++i) {
00052 if(data_[i] < other.data_[i]) { return true; }
00053 if(data_[i] > other.data_[i]) { return false; }
00054 }
00055 return false;
00056 }
00057
00058 T operator[](UINT i) const { assert(i < DIM); return data_[i]; }
00059 T& operator[](UINT i) { assert(i < DIM); return data_[i]; }
00060
00061 T get(UINT i) const { assert(i < DIM); return data_[i]; }
00062 void set(UINT i, T t) { assert(i < DIM); data_[i] = t; }
00063
00064 const T* pointer() const { return data_; }
00065 T* pointer() { return data_; }
00066
00067 VRS_SERIALIZABLE_NO_SO_CLASS(VertexData);
00068
00069 private:
00070 void init(T x, T y, T z, T w) {
00071 assert(DIM < 5);
00072
00073
00074 if(DIM > 0) { data_[0] = x; }
00075 if(DIM > 1) { data_[1] = y; }
00076 if(DIM > 2) { data_[2] = z; }
00077 if(DIM > 3) { data_[3] = w; }
00078 }
00079
00080 protected:
00081 T data_[DIM];
00082 };
00083
00084 template<UINT DIM, typename T>
00085 inline void VertexData<DIM, T>::serialize(SerializationManager& doc) {
00086 if(DIM > 0) { serialization(doc, "X", data_[0], T(0)); }
00087 if(DIM > 1) { serialization(doc, "Y", data_[1], T(0)); }
00088 if(DIM > 2) { serialization(doc, "Z", data_[2], T(0)); }
00089 if(DIM > 3) { serialization(doc, "W", data_[3], T(0)); }
00090 }
00091
00092 template<UINT DIM, typename T>
00093 inline std::ostream& operator<<(std::ostream& out, const VertexData<DIM, T>& vec) {
00094 if(DIM > 0) { out << vec[0]; }
00095 if(DIM > 1) { out << ", " << vec[1]; }
00096 if(DIM > 2) { out << ", " << vec[2]; }
00097 if(DIM > 3) { out << ", " << vec[3]; }
00098 return out;
00099 }
00100
00101 }
00102
00103 #endif // VRS_VERTEXDATA_H