/// @ref gtx_io /// @file glm/gtx/io.hpp /// @author Jan P Springer (regnirpsj@gmail.com) /// /// @see core (dependence) /// @see gtc_matrix_access (dependence) /// @see gtc_quaternion (dependence) /// /// @defgroup gtx_io GLM_GTX_io /// @ingroup gtx /// /// @brief std::[w]ostream support for glm types /// /// std::[w]ostream support for glm types + precision/width/etc. manipulators /// based on howard hinnant's std::chrono io proposal /// [http://home.roadrunner.com/~hinnant/bloomington/chrono_io.html] /// /// needs to be included to use these functionalities. #pragma once // Dependency: #include "../glm.hpp" #include "../gtx/quaternion.hpp" #if GLM_MESSAGES == GLM_MESSAGES_ENABLED && !defined(GLM_EXT_INCLUDED) # pragma message("GLM: GLM_GTX_io extension included") #endif #include // std::basic_ostream<> (fwd) #include // std::locale, std::locale::facet, std::locale::id #include // std::pair<> namespace glm { /// @addtogroup gtx_io /// @{ namespace io { enum order_type { column_major, row_major}; template class format_punct : public std::locale::facet { typedef CTy char_type; public: static std::locale::id id; bool formatted; unsigned precision; unsigned width; char_type separator; char_type delim_left; char_type delim_right; char_type space; char_type newline; order_type order; GLM_FUNC_DECL explicit format_punct(size_t a = 0); GLM_FUNC_DECL explicit format_punct(format_punct const&); }; template > class basic_state_saver { public: GLM_FUNC_DECL explicit basic_state_saver(std::basic_ios&); GLM_FUNC_DECL ~basic_state_saver(); private: typedef ::std::basic_ios state_type; typedef typename state_type::char_type char_type; typedef ::std::ios_base::fmtflags flags_type; typedef ::std::streamsize streamsize_type; typedef ::std::locale const locale_type; state_type& state_; flags_type flags_; streamsize_type precision_; streamsize_type width_; char_type fill_; locale_type locale_; GLM_FUNC_DECL basic_state_saver& operator=(basic_state_saver const&); }; typedef basic_state_saver state_saver; typedef basic_state_saver wstate_saver; template > class basic_format_saver { public: GLM_FUNC_DECL explicit basic_format_saver(std::basic_ios&); GLM_FUNC_DECL ~basic_format_saver(); private: basic_state_saver const bss_; GLM_FUNC_DECL basic_format_saver& operator=(basic_format_saver const&); }; typedef basic_format_saver format_saver; typedef basic_format_saver wformat_saver; struct precision { unsigned value; GLM_FUNC_DECL explicit precision(unsigned); }; struct width { unsigned value; GLM_FUNC_DECL explicit width(unsigned); }; template struct delimeter { CTy value[3]; GLM_FUNC_DECL explicit delimeter(CTy /* left */, CTy /* right */, CTy /* separator */ = ','); }; struct order { order_type value; GLM_FUNC_DECL explicit order(order_type); }; // functions, inlined (inline) template FTy const& get_facet(std::basic_ios&); template std::basic_ios& formatted(std::basic_ios&); template std::basic_ios& unformattet(std::basic_ios&); template std::basic_ostream& operator<<(std::basic_ostream&, precision const&); template std::basic_ostream& operator<<(std::basic_ostream&, width const&); template std::basic_ostream& operator<<(std::basic_ostream&, delimeter const&); template std::basic_ostream& operator<<(std::basic_ostream&, order const&); }//namespace io template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tquat const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tvec1 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tvec2 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tvec3 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tvec4 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat2x2 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat2x3 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat2x4 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat3x2 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat3x3 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat3x4 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat4x2 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat4x3 const&); template GLM_FUNC_DECL std::basic_ostream& operator<<(std::basic_ostream&, tmat4x4 const&); template GLM_FUNC_DECL std::basic_ostream & operator<<(std::basic_ostream &, std::pair const, tmat4x4 const> const &); /// @} }//namespace glm #include "io.inl"