CS计算机代考程序代写 ///////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////
/// OpenGL Mathematics (glm.g-truc.net)
///
/// Copyright (c) 2005 – 2013 G-Truc Creation (www.g-truc.net)
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the “Software”), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
///
/// Restrictions:
/// By making use of the Software for military purposes, you choose to make
/// a Bunny unhappy.
///
/// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
///
/// @ref gtx_io
/// @file glm/gtx/io.inl
/// @date 2013-11-22 / 2014-11-25
/// @author Jan P Springer (regnirpsj@gmail.com)
///////////////////////////////////////////////////////////////////////////////////////////////////

#include // std::setfill<>, std::fixed, std::setprecision, std::right, std::setw
#include // std::basic_ostream<>

namespace glm{
namespace io
{
template
/* explicit */ GLM_FUNC_QUALIFIER
format_punct::format_punct(size_t a)
: std::locale::facet(a),
formatted (true),
precision (3),
width (1 + 4 + 1 + precision),
separator (‘,’),
delim_left (‘[‘),
delim_right (‘]’),
space (‘ ‘),
newline (‘\n’),
order (row_major)
{}

template
/* explicit */ GLM_FUNC_QUALIFIER
format_punct::format_punct(format_punct const& a)
: std::locale::facet(0),
formatted (a.formatted),
precision (a.precision),
width (a.width),
separator (a.separator),
delim_left (a.delim_left),
delim_right (a.delim_right),
space (a.space),
newline (a.newline),
order (a.order)
{}

template std::locale::id format_punct::id;

template
/* explicit */ GLM_FUNC_QUALIFIER basic_state_saver::basic_state_saver(std::basic_ios& a)
: state_ (a),
flags_ (a.flags()),
precision_(a.precision()),
width_ (a.width()),
fill_ (a.fill()),
locale_ (a.getloc())
{}

template
GLM_FUNC_QUALIFIER basic_state_saver::~basic_state_saver()
{
state_.imbue(locale_);
state_.fill(fill_);
state_.width(width_);
state_.precision(precision_);
state_.flags(flags_);
}

template
/* explicit */ GLM_FUNC_QUALIFIER basic_format_saver::basic_format_saver(std::basic_ios& a)
: bss_(a)
{
a.imbue(std::locale(a.getloc(), new format_punct(get_facet >(a))));
}

template
GLM_FUNC_QUALIFIER
basic_format_saver::~basic_format_saver()
{}

/* explicit */ GLM_FUNC_QUALIFIER precision::precision(unsigned a)
: value(a)
{}

/* explicit */ GLM_FUNC_QUALIFIER width::width(unsigned a)
: value(a)
{}

template
/* explicit */ GLM_FUNC_QUALIFIER delimeter::delimeter(CTy a, CTy b, CTy c)
: value()
{
value[0] = a;
value[1] = b;
value[2] = c;
}

/* explicit */ GLM_FUNC_QUALIFIER
order::order(order_type a)
: value(a)
{}

template
GLM_FUNC_QUALIFIER FTy const& get_facet(std::basic_ios& ios)
{
if (!std::has_facet(ios.getloc())) {
ios.imbue(std::locale(ios.getloc(), new FTy));
}

return std::use_facet(ios.getloc());
}

template
GLM_FUNC_QUALIFIER std::basic_ios& formatted(std::basic_ios& ios)
{
const_cast&>(get_facet >(ios)).formatted = true;

return ios;
}

template
GLM_FUNC_QUALIFIER std::basic_ios& unformatted(std::basic_ios& ios)
{
const_cast&>(get_facet >(ios)).formatted = false;

return ios;
}

template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, precision const& a)
{
const_cast&>(get_facet >(os)).precision = a.value;

return os;
}

template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, width const& a)
{
const_cast&>(get_facet >(os)).width = a.value;

return os;
}

template
std::basic_ostream& operator<<(std::basic_ostream& os, delimeter const& a)
{
format_punct & fmt(const_cast&>(get_facet >(os)));

fmt.delim_left = a.value[0];
fmt.delim_right = a.value[1];
fmt.separator = a.value[2];

return os;
}

template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, order const& a)
{
const_cast&>(get_facet >(os)).order = a.value;

return os;
}
} // namespace io

template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tquat const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));

if(fmt.formatted)
{
io::basic_state_saver const bss(os);

os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left << std::setw(fmt.width) << a.w << fmt.separator << std::setw(fmt.width) << a.x << fmt.separator << std::setw(fmt.width) << a.y << fmt.separator << std::setw(fmt.width) << a.z << fmt.delim_right; } else { os << a.w << fmt.space << a.x << fmt.space << a.y << fmt.space << a.z; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tvec2 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));

if(fmt.formatted)
{
io::basic_state_saver const bss(os);

os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left << std::setw(fmt.width) << a.x << fmt.separator << std::setw(fmt.width) << a.y << fmt.delim_right; } else { os << a.x << fmt.space << a.y; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tvec3 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));

if(fmt.formatted)
{
io::basic_state_saver const bss(os);

os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left << std::setw(fmt.width) << a.x << fmt.separator << std::setw(fmt.width) << a.y << fmt.separator << std::setw(fmt.width) << a.z << fmt.delim_right; } else { os << a.x << fmt.space << a.y << fmt.space << a.z; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tvec4 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));

if(fmt.formatted)
{
io::basic_state_saver const bss(os);

os << std::fixed << std::right << std::setprecision(fmt.precision) << std::setfill(fmt.space) << fmt.delim_left << std::setw(fmt.width) << a.x << fmt.separator << std::setw(fmt.width) << a.y << fmt.separator << std::setw(fmt.width) << a.z << fmt.separator << std::setw(fmt.width) << a.w << fmt.delim_right; } else { os << a.x << fmt.space << a.y << fmt.space << a.z << fmt.space << a.w; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tmat2x2 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat2x2 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tmat2x3 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat3x2 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tmat2x4 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat4x2 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.newline << fmt.space << m[3] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tmat3x2 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat2x3 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<(std::basic_ostream& os, tmat3x3 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat3x3 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, tmat3x4 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat4x3 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if (fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.newline << fmt.space << m[3] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, tmat4x2 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat2x4 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if (fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, tmat4x3 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat3x4 m(a);

if(io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream & operator<<(std::basic_ostream& os, tmat4x4 const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat4x4 m(a);

if (io::row_major == fmt.order)
m = transpose(a);

if(fmt.formatted)
{
os << fmt.newline << fmt.delim_left << m[0] << fmt.newline << fmt.space << m[1] << fmt.newline << fmt.space << m[2] << fmt.newline << fmt.space << m[3] << fmt.delim_right; } else { os << m[0] << fmt.space << m[1] << fmt.space << m[2] << fmt.space << m[3]; } } return os; } template
GLM_FUNC_QUALIFIER std::basic_ostream& operator<<( std::basic_ostream & os,
std::pair const, tmat4x4 const> const& a)
{
typename std::basic_ostream::sentry const cerberus(os);

if(cerberus)
{
io::format_punct const & fmt(io::get_facet >(os));
tmat4x4 ml(a.first);
tmat4x4 mr(a.second);

if(io::row_major == fmt.order)
{
ml = transpose(a.first);
mr = transpose(a.second);
}

if(fmt.formatted)
{
CTy const & l(fmt.delim_left);
CTy const & r(fmt.delim_right);
CTy const & s(fmt.space);

os << fmt.newline << l << ml[0] << s << s << l << mr[0] << fmt.newline << s << ml[1] << s << s << s << mr[1] << fmt.newline << s << ml[2] << s << s << s << mr[2] << fmt.newline << s << ml[3] << r << s << s << mr[3] << r; } else { os << ml << fmt.space << mr; } } return os; } }//namespace glm