1 /// @ref gtx_io 2 /// @file glm/gtx/io.hpp 3 /// @author Jan P Springer (regnirpsj@gmail.com) 4 /// 5 /// @see core (dependence) 6 /// @see gtc_matrix_access (dependence) 7 /// @see gtc_quaternion (dependence) 8 /// 9 /// @defgroup gtx_io GLM_GTX_io 10 /// @ingroup gtx 11 /// 12 /// @brief std::[w]ostream support for glm types 13 /// 14 /// std::[w]ostream support for glm types + precision/width/etc. manipulators 15 /// based on howard hinnant's std::chrono io proposal 16 /// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html] 17 /// 18 /// <glm/gtx/io.hpp> needs to be included to use these functionalities. 19 20 #pragma once 21 22 // Dependency: 23 #include "../glm.hpp" 24 #include "../gtx/quaternion.hpp" 25 26 #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) 27 # pragma message("GLM: GLM_GTX_io extension included") 28 #endif 29 30 #include <iosfwd> // std::basic_ostream<> (fwd) 31 #include <locale> // std::locale, std::locale::facet, std::locale::id 32 #include <utility> // std::pair<> 33 34 namespace glm 35 { 36 /// @addtogroup gtx_io 37 /// @{ 38 39 namespace io 40 { 41 enum order_type { column_major, row_major}; 42 43 template <typename CTy> 44 class format_punct : public std::locale::facet 45 { 46 typedef CTy char_type; 47 48 public: 49 50 static std::locale::id id; 51 52 bool formatted; 53 unsigned precision; 54 unsigned width; 55 char_type separator; 56 char_type delim_left; 57 char_type delim_right; 58 char_type space; 59 char_type newline; 60 order_type order; 61 62 GLM_FUNC_DECL explicit format_punct(size_t a = 0); 63 GLM_FUNC_DECL explicit format_punct(format_punct const&); 64 }; 65 66 template <typename CTy, typename CTr = std::char_traits<CTy> > 67 class basic_state_saver { 68 69 public: 70 71 GLM_FUNC_DECL explicit basic_state_saver(std::basic_ios<CTy,CTr>&); 72 GLM_FUNC_DECL ~basic_state_saver(); 73 74 private: 75 76 typedef ::std::basic_ios<CTy,CTr> state_type; 77 typedef typename state_type::char_type char_type; 78 typedef ::std::ios_base::fmtflags flags_type; 79 typedef ::std::streamsize streamsize_type; 80 typedef ::std::locale const locale_type; 81 82 state_type& state_; 83 flags_type flags_; 84 streamsize_type precision_; 85 streamsize_type width_; 86 char_type fill_; 87 locale_type locale_; 88 89 GLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&); 90 }; 91 92 typedef basic_state_saver<char> state_saver; 93 typedef basic_state_saver<wchar_t> wstate_saver; 94 95 template <typename CTy, typename CTr = std::char_traits<CTy> > 96 class basic_format_saver 97 { 98 public: 99 100 GLM_FUNC_DECL explicit basic_format_saver(std::basic_ios<CTy,CTr>&); 101 GLM_FUNC_DECL ~basic_format_saver(); 102 103 private: 104 105 basic_state_saver<CTy> const bss_; 106 107 GLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&); 108 }; 109 110 typedef basic_format_saver<char> format_saver; 111 typedef basic_format_saver<wchar_t> wformat_saver; 112 113 struct precision 114 { 115 unsigned value; 116 117 GLM_FUNC_DECL explicit precision(unsigned); 118 }; 119 120 struct width 121 { 122 unsigned value; 123 124 GLM_FUNC_DECL explicit width(unsigned); 125 }; 126 127 template <typename CTy> 128 struct delimeter 129 { 130 CTy value[3]; 131 132 GLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ','); 133 }; 134 135 struct order 136 { 137 order_type value; 138 139 GLM_FUNC_DECL explicit order(order_type); 140 }; 141 142 // functions, inlined (inline) 143 144 template <typename FTy, typename CTy, typename CTr> 145 FTy const& get_facet(std::basic_ios<CTy,CTr>&); 146 template <typename FTy, typename CTy, typename CTr> 147 std::basic_ios<CTy,CTr>& formatted(std::basic_ios<CTy,CTr>&); 148 template <typename FTy, typename CTy, typename CTr> 149 std::basic_ios<CTy,CTr>& unformattet(std::basic_ios<CTy,CTr>&); 150 151 template <typename CTy, typename CTr> 152 std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, precision const&); 153 template <typename CTy, typename CTr> 154 std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, width const&); 155 template <typename CTy, typename CTr> 156 std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, delimeter<CTy> const&); 157 template <typename CTy, typename CTr> 158 std::basic_ostream<CTy, CTr>& operator<<(std::basic_ostream<CTy, CTr>&, order const&); 159 }//namespace io 160 161 template <typename CTy, typename CTr, typename T, precision P> 162 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tquat<T,P> const&); 163 template <typename CTy, typename CTr, typename T, precision P> 164 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec1<T,P> const&); 165 template <typename CTy, typename CTr, typename T, precision P> 166 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec2<T,P> const&); 167 template <typename CTy, typename CTr, typename T, precision P> 168 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec3<T,P> const&); 169 template <typename CTy, typename CTr, typename T, precision P> 170 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tvec4<T,P> const&); 171 template <typename CTy, typename CTr, typename T, precision P> 172 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x2<T,P> const&); 173 template <typename CTy, typename CTr, typename T, precision P> 174 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x3<T,P> const&); 175 template <typename CTy, typename CTr, typename T, precision P> 176 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat2x4<T,P> const&); 177 template <typename CTy, typename CTr, typename T, precision P> 178 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x2<T,P> const&); 179 template <typename CTy, typename CTr, typename T, precision P> 180 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x3<T,P> const&); 181 template <typename CTy, typename CTr, typename T, precision P> 182 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat3x4<T,P> const&); 183 template <typename CTy, typename CTr, typename T, precision P> 184 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x2<T,P> const&); 185 template <typename CTy, typename CTr, typename T, precision P> 186 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x3<T,P> const&); 187 template <typename CTy, typename CTr, typename T, precision P> 188 GLM_FUNC_DECL std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>&, tmat4x4<T,P> const&); 189 190 template <typename CTy, typename CTr, typename T, precision P> 191 GLM_FUNC_DECL std::basic_ostream<CTy,CTr> & operator<<(std::basic_ostream<CTy,CTr> &, 192 std::pair<tmat4x4<T,P> const, tmat4x4<T,P> const> const &); 193 194 /// @} 195 }//namespace glm 196 197 #include "io.inl" 198