Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

basics/outputMatlab.hh
Go to the documentation of this file.
00001 /* matlab output function
00002  */
00003 
00004 #ifndef OutputMatlab_hh
00005 #define OutputMatlab_hh
00006 
00007 #include <iostream>
00008 #include <complex>
00009 #include <set>
00010 #include <map>
00011 #include <vector>
00012 #include <queue>
00013 #include "outputOperator.hh"
00014 #include "vectorsMatrices.hh"
00015 #include <iomanip>
00016 
00017 namespace concepts {
00018 
00019   // ********************************************************** outputMatlab **
00020 
00026   // general matlab output
00027   template<typename T>
00028   std::ostream& outputMatlab(std::ostream& os, const T& val) {
00029     return os << std::setw(13) << std::scientific << val;
00030   }
00031 
00032   // special matlab output for complex numbers
00033   template<typename T>
00034     std::ostream& outputMatlab(std::ostream& os, const std::complex<T>& val) {
00035       const T r = std::real(val), 
00036             i = std::imag(val);
00037       /*
00038       if (r != 0 || i == 0) 
00039         os << std::setw(12) << std::scientific << r;
00040       if (i != 0) {
00041         if (i > 0) {
00042           if (r != 0) 
00043             os << '+';
00044         } else 
00045           os << '-';
00046 #if _GLIBCPP_USE_C99
00047         if (std::isnan(i)) 
00048           os << "NaN*i";
00049         else
00050 #endif
00051         {
00052           if (std::abs(i) != 1) 
00053             os << std::setw(12) <<  std::scientific << std::abs(i);
00054           os << 'i';
00055         }
00056       }*/
00057       os << std::setw(13) << std::scientific << r;
00058       if (i > 0) {
00059         os << '+';
00060       } else 
00061         os << '-';
00062 
00063 #if _GLIBCPP_USE_C99
00064         if (std::isnan(i)) 
00065           os << "NaN*i";
00066         else
00067 #endif
00068         {
00069           if (std::abs(i) != 1) 
00070             os << std::setw(13) <<  std::scientific << std::abs(i);
00071           os << 'i';
00072         }
00073 
00074 
00075       return os;
00076     }
00077 
00078   // ********************************************************** OutputMatlab **
00079 
00085   template<typename F>
00086     class OutputMatlab : public OutputOperator {
00087       public:
00088         OutputMatlab(const F& val) : val_(val) {}
00089       protected:
00091         std::ostream& info(std::ostream& os) const {
00092           return outputMatlab(os, val_);
00093         }
00094       private:
00095         const F& val_;
00096     };
00097 
00099   template<typename F, int dim>
00100     class OutputMatlab<Point<F,dim> > : public OutputOperator {
00101       public:
00102         OutputMatlab(const Point<F,dim>& val) : val_(val) {}
00103       protected:
00105         std::ostream& info(std::ostream& os) const {
00106           os << '[' << OutputMatlab<F>(val_[0]) << ';' << OutputMatlab<F>(val_[1]);
00107           if (dim == 3) os << ';' << OutputMatlab<F>(val_[2]);
00108           return os << ']';
00109         }
00110       private:
00111         const Point<F,dim>& val_;
00112     };
00113 
00115   template<typename F, int dim>
00116   class OutputMatlab<Mapping<F,dim> > : public OutputOperator {
00117   public:
00118     OutputMatlab(const Mapping<F,dim>& val) : val_(val) {}
00119   protected:
00122     std::ostream& info(std::ostream& os) const {
00123       os << '[';
00124       for(uint i = 0; i < dim; ++i)
00125         for(uint j = 0; j < dim; ++j)
00126           os << OutputMatlab<F>(val_(i,j)) << ';';
00127       return os << ']';
00128     }
00129   private:
00130     const Mapping<F,dim>& val_;
00131   };
00132   
00134   template<typename F>
00135   class OutputMatlab<F*> : public OutputOperator {
00136       public:
00137         OutputMatlab(const F* val) : val_(val) {}
00138       protected:
00140         std::ostream& info(std::ostream& os) const {
00141           if (val_) return os << OutputMatlab<F>(*val_);
00142           return os << 0;
00143         }
00144       private:
00145         const F* val_;
00146     };
00147 
00149   template<>
00150     class OutputMatlab<std::string> : public OutputOperator {
00151       public:
00152         OutputMatlab(const std::string val) : val_(val) {}
00153       protected:
00155         std::ostream& info(std::ostream& os) const {
00156           return os << "'" << val_ << "'";
00157         }
00158       private:
00159         const std::string val_;
00160     };
00161 
00163   template<>
00164     class OutputMatlab<char*> : public OutputMatlab<std::string> {
00165       public:
00166         OutputMatlab(const char* val) : OutputMatlab<std::string>(val) {}
00167     };
00168 
00169   template<>
00170     class OutputMatlab<bool> :  public OutputOperator {
00171       public:
00172         OutputMatlab(const bool val) : val_(val) {}
00173       protected:
00175         std::ostream& info(std::ostream& os) const {
00176           bool nobool = !(os.flags() & std::ios_base::boolalpha);
00177           os << std::boolalpha << val_;
00178           if (nobool) os << std::noboolalpha;
00179           return os;
00180         }
00181       private:
00182         const bool val_;
00183     };
00184 
00185   template<class F>
00186     class OutputMatlab<std::set<F> > :  public OutputOperator {
00187       public:
00188         OutputMatlab(const std::set<F>& val) : val_(val) {}
00189       protected:
00191         std::ostream& info(std::ostream& os) const {
00192           os << '[';
00193           typename std::set<F>::const_iterator i = val_.begin();
00194           for(; i != val_.end(); ) {
00195             os << OutputMatlab<F>(*i);
00196             if (++i != val_.end()) os << ", ";
00197           }
00198           return os << ']';
00199         }
00200       private:
00201         const std::set<F> val_;
00202     };
00203 
00204   template<class F, class G>
00205     class OutputMatlab<std::map<F,G> > :  public OutputOperator {
00206       public:
00207         OutputMatlab(const std::map<F,G>& val) : val_(val) {}
00208       protected:
00210         std::ostream& info(std::ostream& os) const {
00211           os << '[';
00212           typename std::map<F,G>::const_iterator i = val_.begin();
00213           for(; i != val_.end(); ++i)
00214             os << "(" << OutputMatlab<F>(i->first) << ", "
00215               << OutputMatlab<G>(i->second)  << ") ";
00216           return os << ']';
00217         }
00218       private:
00219         const std::map<F,G> val_;
00220     };
00221 
00222   template<class F>
00223     class OutputMatlab<std::vector<F> > :  public OutputOperator {
00224       public:
00225         OutputMatlab(const std::vector<F>& val) : val_(val) {}
00226       protected:
00228         std::ostream& info(std::ostream& os) const {
00229           os << '[';
00230           typename std::vector<F>::const_iterator i = val_.begin();
00231           for(; i != val_.end();) {
00232             os << OutputMatlab<F>(*i);
00233             if (++i != val_.end()) os << ", ";
00234           }
00235           return os << ']';
00236         }
00237       private:
00238         const std::vector<F> val_;
00239     };
00240 
00241   template<class F>
00242     class OutputMatlab<std::queue<F> > :  public OutputOperator {
00243       public:
00245         OutputMatlab(const std::queue<F>& val) : val_(val) {}
00246       protected:
00248         std::ostream& info(std::ostream& os) const {
00249           std::queue<F> val = val_;
00250           os << '[';
00251           const uint size = val.size();
00252           for(uint i = 0; i < size; ++i) {
00253             os << OutputMatlab<F>(val.front());
00254             if (i < size - 1) os << ", ";
00255             val.pop();               // erase first element
00256           }
00257           return os << ']';
00258         }
00259       private:
00260         const std::queue<F> val_;
00261     };
00262 
00263 } // namespace concepts
00264 
00265 #endif // OutputMatlab_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)