Mercurial > hg > segmenter-vamp-plugin
diff armadillo-2.4.4/include/armadillo_bits/format_wrap.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/armadillo-2.4.4/include/armadillo_bits/format_wrap.hpp Wed Apr 11 09:27:06 2012 +0100 @@ -0,0 +1,551 @@ +// Copyright (C) 2008-2010 NICTA (www.nicta.com.au) +// Copyright (C) 2008-2010 Conrad Sanderson +// +// This file is part of the Armadillo C++ library. +// It is provided without any warranty of fitness +// for any purpose. You can redistribute this file +// and/or modify it under the terms of the GNU +// Lesser General Public License (LGPL) as published +// by the Free Software Foundation, either version 3 +// of the License or (at your option) any later version. +// (see http://www.opensource.org/licenses for more info) + + +//! \addtogroup format_wrap +//! @{ + + +//! \namespace arma_boost namespace for functions and classes which partially emulate Boost functionality +namespace arma_boost + { + + #if defined(ARMA_USE_BOOST_FORMAT) + + using boost::format; + using boost::basic_format; + using boost::str; + + #else + + #if defined(ARMA_HAVE_STD_SNPRINTF) + + #define arma_snprintf std::snprintf + + #else + + // better-than-nothing emulation of C99 snprintf(), + // with correct return value and null-terminated output string. + // note that _snprintf() provided by MS is not a good substitute for snprintf() + + inline + int + arma_snprintf(char* out, size_t size, const char* fmt, ...) + { + size_t i; + + for(i=0; i<size; ++i) + { + out[i] = fmt[i]; + if(fmt[i] == char(0)) + break; + } + + if(size > 0) + out[size-1] = char(0); + + return int(i); + } + + #endif + + class format + { + public: + + format(const char* in_fmt) + : A(in_fmt) + { + } + + format(const std::string& in_fmt) + : A(in_fmt) + { + } + + + const std::string A; + + private: + format(); + }; + + + + template<typename T1, typename T2> + class basic_format + { + public: + + basic_format(const T1& in_A, const T2& in_B) + : A(in_A) + , B(in_B) + { + } + + const T1& A; + const T2& B; + + private: + basic_format(); + }; + + + + template<typename T2> + inline + basic_format< format, T2 > + operator% (const format& X, const T2& arg) + { + return basic_format< format, T2 >(X, arg); + } + + + + template<typename T1, typename T2, typename T3> + inline + basic_format< basic_format<T1,T2>, T3 > + operator% (const basic_format<T1,T2>& X, const T3& arg) + { + return basic_format< basic_format<T1,T2>, T3 >(X, arg); + } + + + + template<typename T2> + inline + std::string + str(const basic_format< format, T2>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.c_str(), X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T2, typename T3> + inline + std::string + str(const basic_format< basic_format< format, T2>, T3>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.c_str(), X.A.B, X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T2, typename T3, typename T4> + inline + std::string + str(const basic_format< basic_format< basic_format< format, T2>, T3>, T4>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.c_str(), X.A.A.B, X.A.B, X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T2, typename T3, typename T4, typename T5> + inline + std::string + str(const basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.c_str(), X.A.A.A.B, X.A.A.B, X.A.B, X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T2, typename T3, typename T4, typename T5, typename T6> + inline + std::string + str(const basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.c_str(), X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> + inline + std::string + str(const basic_format< basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>, T7>& X) + { + char local_buffer[1024]; + char* buffer = local_buffer; + + int buffer_size = 1024; + int required_size = buffer_size; + + bool using_local_buffer = true; + + std::string out; + + do + { + if(using_local_buffer == false) + { + buffer = new char[buffer_size]; + } + + required_size = arma_snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.A.c_str(), X.A.A.A.A.A.B, X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B); + + if(required_size < buffer_size) + { + if(required_size > 0) + { + out = buffer; + } + } + else + { + buffer_size *= 2; + } + + if(using_local_buffer == true) + { + using_local_buffer = false; + } + else + { + delete[] buffer; + } + + } while( (required_size >= buffer_size) ); + + return out; + } + + + + template<typename T1> + struct format_metaprog + { + static const uword depth = 0; + + inline + static + const std::string& + get_fmt(const T1& X) + { + return X.A; + } + }; + + + + //template<> + template<typename T1, typename T2> + struct format_metaprog< basic_format<T1,T2> > + { + static const uword depth = 1 + format_metaprog<T1>::depth; + + inline + static + const std::string& + get_fmt(const T1& X) + { + return format_metaprog<T1>::get_fmt(X.A); + } + + }; + + + + template<typename T1, typename T2> + inline + std::string + str(const basic_format<T1,T2>& X) + { + return format_metaprog< basic_format<T1,T2> >::get_fmt(X.A); + } + + + + template<typename T1, typename T2> + inline + std::ostream& + operator<< (std::ostream& o, const basic_format<T1,T2>& X) + { + o << str(X); + return o; + } + + + #endif + + + template<typename T> struct string_only { }; + template<> struct string_only<std::string> { typedef std::string result; }; + + template<typename T> struct char_only { }; + template<> struct char_only<char > { typedef char result; }; + + template<typename T> + struct basic_format_only { }; + + #if defined(ARMA_USE_BOOST_FORMAT) + template<typename T> + struct basic_format_only< basic_format<T> > { typedef basic_format<T> result; }; + #else + template<typename T1, typename T2> + struct basic_format_only< basic_format<T1, T2> > { typedef basic_format<T1,T2> result; }; + #endif + + + + template<typename T1> + inline + static + const T1& + str_wrapper(const T1& x, const typename string_only<T1>::result* junk = 0) + { + arma_ignore(junk); + + return x; + } + + + + template<typename T1> + inline + static + const T1* + str_wrapper(const T1* x, const typename char_only<T1>::result* junk = 0) + { + arma_ignore(junk); + + return x; + } + + + + template<typename T1> + inline + static + std::string + str_wrapper(const T1& x, const typename basic_format_only<T1>::result* junk = 0) + { + arma_ignore(junk); + + return str(x); + } + + } + +//! @}