Go to the documentation of this file.00001
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
00020
00026
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
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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
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
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();
00256 }
00257 return os << ']';
00258 }
00259 private:
00260 const std::queue<F> val_;
00261 };
00262
00263 }
00264
00265 #endif // OutputMatlab_hh