SpherePackingScenarioGenerator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
VectorField.h
Go to the documentation of this file.
00001 #ifndef VectorField_H
00002 #define VectorField_H
00003 
00004 #include <iostream>
00005 #include <fstream>
00006 #include "algorithms/ls/Vector.h"
00007 
00012 namespace algorithms{
00013 namespace ls{
00014 
00015 template<int V, int D, typename T=double>
00016 class VectorField {
00017 
00018 public:
00019         int elements;
00020 
00021 private:
00022         Vector<V, T>* f;
00023         Vector<D, int> size;           // number of grid points for each dimension
00024         Vector<D, int> offset;
00025 
00026 public:
00030         VectorField();
00034         VectorField(const Vector<D, int>&);
00038         ~VectorField();
00042         Vector<D, int> get_size() const;
00046         void set_size(const Vector<D, int>&);
00050         Vector<V, T>& get(const Vector<D, int>&);
00054         void read(std::ifstream&);
00058         void write(std::ofstream&) const;
00062         static void swap(VectorField<V, D, T>&, VectorField<V, D, T>&);
00063 };
00064 
00065 
00066 template<int V, int D, typename T>
00067 VectorField<V, D, T>::VectorField()
00068 : f(0), elements(0)
00069   {
00070   }
00071 
00072 
00073 template<int V, int D, typename T>
00074 VectorField<V, D, T>::VectorField(const Vector<D, int>& s)inline
00075 : f(0)
00076   {
00077         set_size(s);
00078   }
00079 
00080 
00081 template <int V, int D, typename T>
00082 VectorField<V, D, T>::~VectorField()
00083 {
00084         if(f != 0)
00085                 delete[] f;
00086 }
00087 
00088 template<int V, int D, typename T>
00089 inline Vector<D, int> VectorField<V, D, T>::get_size() const
00090 {
00091         return size;
00092 }
00093 
00094 template<int V, int D, typename T>
00095 void VectorField<V, D, T>::set_size(const Vector<D, int>& s)
00096 {
00097         if(f != 0)
00098                 delete[] f;
00099 
00100         size = s;
00101 
00102         elements = 1;
00103         for(int i=0; i<D; i++) {
00104                 offset[i] = elements;
00105                 elements *= size.x[i];
00106         }
00107 
00108         f = new Vector<V, T>[elements];
00109 }
00110 
00111 template<int V, int D, typename T>
00112 inline Vector<V, T>& VectorField<V, D, T>::get(const Vector<D, int>& pos)
00113 {
00114         int p=0;
00115         for(int i=0; i<D; i++)
00116                 p += pos.x[i]*offset[i];
00117 
00118         return f[p];
00119 }
00120 
00121 
00122 template<int V, int D, typename T>
00123 void VectorField<V, D, T>::read(std::ifstream& in)
00124 {
00125         in.read((char*)f, elements*sizeof(T)*V);
00126 }
00127 
00128 
00129 template<int V, int D, typename T>
00130 void VectorField<V, D, T>::write(std::ofstream& out) const
00131 {
00132         out.write((const char*)f, elements*sizeof(T)*V);
00133 }
00134 
00135 template<int V, int D, typename T>
00136 void VectorField<V, D, T>::swap(VectorField<V, D, T>& v1,
00137                 VectorField<V, D, T>& v2)
00138                 {
00139         Vector<V, T>* f;
00140 
00141         f = v1.f;
00142         v1.f = v2.f;
00143         v2.f = f;
00144                 }
00145 
00146 }/* close namespace ls */
00147 }/* close namespace algorithms */
00148 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines