MC_double_vector.hpp

Go to the documentation of this file.
00001 /*
00002 **    Mesh Converter
00003 **    Copyright (C) 2009  Damien Rohmer
00004 **
00005 **    This program is free software: you can redistribute it and/or modify
00006 **    it under the terms of the GNU General Public License as published by
00007 **    the Free Software Foundation, either version 3 of the License, or
00008 **    (at your option) any later version.
00009 **
00010 **   This program is distributed in the hope that it will be useful,
00011 **    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 **    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 **    GNU General Public License for more details.
00014 **
00015 **    You should have received a copy of the GNU General Public License
00016 **    along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017 */
00018 
00019 
00020 #ifndef MC_DOUBLE_VECTOR_H_
00021 #define MC_DOUBLE_VECTOR_H_
00022 
00023 #include <stdlib.h>
00024 #include <vector>
00025 #include <map>
00026 #include <set>
00027 #include <iostream>
00028 #include <algorithm>
00029 
00030 
00031 
00032 namespace mesh_conv
00033 {
00034 
00035     class MC_int_vector;
00036     class MC_v3d;
00037     class MC_v3d_vector;
00038 
00039 
00040     // helper functor class to compare struct
00041     class comparator_less_double_int
00042     {
00043          public:
00044         bool operator()(const std::pair<double,int> a,const std::pair <double,int> b) const
00045         {return (a.first<b.first);}
00046     };
00047 
00048 
00050 
00052   class MC_double_vector
00053   {
00054 
00055   public:
00056 
00057     //************************************************//
00058     //************************************************//
00059     //CONSTRUCTORS
00060     //************************************************//
00061     //************************************************//
00062     
00064     MC_double_vector();
00066     MC_double_vector(const double& u0);
00068     MC_double_vector(const double& u0,const double& u1);
00070     MC_double_vector(const double& u0,const double& u1,const double& u2);
00072     MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3);
00074     MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3,const double& u4);
00076     MC_double_vector(const double& u0,const double& u1,const double& u2,const double& u3,const double& u4,const double& u5);
00081     MC_double_vector(const std::string& in,const std::string& separator=" ");
00082 
00084     MC_double_vector(const std::set <double>& vec);
00089     MC_double_vector(const std::map <double,int> &vec);
00091     MC_double_vector(const std::vector <double> &vec);
00093     MC_double_vector(const MC_v3d& vec);
00095     MC_double_vector(const MC_double_vector& vec);
00096 
00097 
00098     //************************************************//
00099     //************************************************//
00100     //Asserts
00101     //************************************************//
00102     //************************************************//
00103 
00107     void assert_bounds(const int& u) const;
00108 
00109 
00110 
00111     //************************************************//
00112     //************************************************//
00113     //change type
00114     //************************************************//
00115     //************************************************//
00116 
00120     std::vector <double>& get_vector();
00126     const std::vector <double>& to_vector() const;
00127 
00131     std::set <double> to_set() const;
00135     std::map <double,int> to_map() const;
00136 
00137 
00138     
00139 
00140     //************************************************//
00141     //************************************************//
00142     //Initialize value
00143     //************************************************//
00144     //************************************************//
00145 
00147     static MC_double_vector zeros(const int& new_size);
00148 
00150     static MC_double_vector linspace(const double& begin,const double& end,const double& iteration=1);
00152     static MC_double_vector sample(const double& begin=0,const double& end=1,const int& N_sample=100);
00153 
00154 
00155     //************************************************//
00156     //************************************************//
00157     //manipulate
00158     //************************************************//
00159     //************************************************//
00160 
00162     void clear();
00163 
00167     MC_double_vector& resize(const int& new_size);
00168 
00172     MC_double_vector& add(const double& val);
00176     friend MC_double_vector operator<<(const MC_double_vector& vec,const double& value);
00177 
00178 
00182     MC_double_vector& add(const MC_double_vector& val);
00186     friend MC_double_vector operator<<(const MC_double_vector& vec,const MC_double_vector& to_add);
00187 
00191     MC_double_vector& set(const int& k_index,const double& new_value);
00199     MC_double_vector& set(const MC_int_vector& k_index,const MC_double_vector& new_value);
00200 
00206     std::pair <MC_double_vector,double> delete_index(const int& index_to_delete) const;
00212     std::pair <MC_double_vector,MC_double_vector> delete_index(const MC_int_vector& index_to_delete) const;
00213     
00214 
00219     std::pair <MC_double_vector,MC_int_vector> sort() const;
00220 
00222     MC_double_vector inverted() const;
00223 
00224 
00225     //************************************************//
00226     //************************************************//
00227     //Informations
00228     //************************************************//
00229     //************************************************//
00230 
00232     int size() const;
00233 
00235     std::pair <double,int> min() const;
00237     std::pair <double,int> max() const;
00238 
00239     //************************************************//
00240     //************************************************//
00241     //Math operator
00242     //************************************************//
00243     //************************************************//
00244 
00248     friend MC_double_vector operator-(const MC_double_vector& v);
00249 
00253     friend MC_double_vector operator+(const MC_double_vector& vec,const double& to_add);
00257     friend MC_double_vector operator-(const MC_double_vector& vec,const double& to_sub);
00261     friend MC_double_vector operator*(const MC_double_vector& vec,const double& to_mult);
00265     friend MC_double_vector operator*(const double& to_mult,const MC_double_vector& vec);
00266 
00270     friend MC_double_vector operator/(const MC_double_vector& vec,const double& to_subdiv);
00271 
00272 
00278     friend MC_v3d_vector operator*(const MC_double_vector& vec,const MC_v3d& to_mult);
00284     friend MC_v3d_vector operator*(const MC_v3d& to_mult,const MC_double_vector& vec);
00288     friend MC_v3d_vector operator/(const MC_v3d& vec,const MC_double_vector& to_subdiv);
00289 
00290 
00291 
00297     friend MC_double_vector operator+(const MC_double_vector& vec,const MC_double_vector& to_add);
00303     friend MC_double_vector operator-(const MC_double_vector& vec,const MC_double_vector& to_sub);
00309     friend MC_double_vector operator*(const MC_double_vector& vec,const MC_double_vector& to_mult);
00315     friend MC_double_vector operator/(const MC_double_vector& vec,const MC_double_vector& to_subdiv);
00316 
00317 
00318 
00320     MC_double_vector& operator+=(const double& to_add);
00322     MC_double_vector& operator-=(const double& to_sub);
00324     MC_double_vector& operator*=(const double& to_mult);
00326     MC_double_vector& operator/=(const double& to_subdiv);
00327 
00332     MC_double_vector& operator+=(const MC_double_vector& to_add);
00337     MC_double_vector& operator-=(const MC_double_vector& to_sub);
00342     MC_double_vector& operator*=(const MC_double_vector& to_mult);
00347     MC_double_vector& operator/=(const MC_double_vector& to_subdiv);
00348 
00349 
00353     friend MC_int_vector operator<(const MC_double_vector& vec,const double& val);
00357     friend MC_int_vector operator<=(const MC_double_vector& vec,const double& val);
00361     friend MC_int_vector operator>(const MC_double_vector& vec,const double& val);
00365     friend MC_int_vector operator>=(const MC_double_vector& vec,const double& val);
00369     friend MC_int_vector operator==(const MC_double_vector& vec,const double& val);
00370 
00371 
00372 
00376     friend MC_int_vector operator<(const double& val,const MC_double_vector& vec);
00380     friend MC_int_vector operator<=(const double& val,const MC_double_vector& vec);
00384     friend MC_int_vector operator>(const double& val,const MC_double_vector& vec);
00388     friend MC_int_vector operator>=(const double& val,const MC_double_vector& vec);
00392     friend MC_int_vector operator==(const double& val,const MC_double_vector& vec);
00393 
00394 
00395     //************************************************//
00396     //************************************************//
00397     // Math
00398     //************************************************//
00399     //************************************************//
00400 
00401 
00403     static double sum(const MC_double_vector& input);
00405     static MC_double_vector abs(const MC_double_vector& input);
00406 
00408     double norm_2() const;
00409 
00411     double dot(const MC_double_vector& v) const;
00412 
00413 
00414     //************************************************//
00415     //************************************************//
00416     //Get value
00417     //************************************************//
00418     //************************************************//
00419 
00421     const double& operator()(const int& index) const ;
00423     double& operator()(const int& index) ;
00425     const double& operator[](const int& index) const ;
00427     double& operator[](const int& index) ;
00428 
00430     MC_double_vector operator()(const MC_int_vector& index) const;
00432     MC_double_vector operator[](const MC_int_vector& index) const;
00433 
00434 
00436     const double& first() const;
00438     double& first();
00440     const double& last() const;
00442     double& last();
00443 
00444 
00447     const double* pointer() const;
00450     double* pointer_unprotected();
00451 
00452     //************************************************//
00453     //************************************************//
00454     //OUTPUT
00455     //************************************************//
00456     //************************************************//
00457     
00459     friend std::ostream& operator<<(std::ostream& output,const MC_double_vector& in);
00460 
00465     friend MC_double_vector& operator>>(std::istream& input,MC_double_vector& vec);
00466 
00467 
00468   private:
00469     
00471     std::vector <double> double_list;
00472 
00473   };
00474 
00475 
00476 
00477 
00478 }
00479 
00480 #endif

Generated on Sun Apr 18 20:24:47 2010 by  doxygen 1.6.1