123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- // Copyright (c) 2009-2016 Vladimir Batov.
- // Use, modification and distribution are subject to the Boost Software License,
- // Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
- #ifndef BOOST_CONVERT_TEST_HPP
- #define BOOST_CONVERT_TEST_HPP
- #include <boost/convert/detail/config.hpp>
- #include <boost/make_default.hpp>
- #include <boost/static_assert.hpp>
- #include <string>
- #include <istream>
- #include <string.h> // For strlen, strcmp, memcpy
- #include <memory.h> // Is needed for 'memset'
- #include <stdio.h>
- #include <time.h>
- #if defined(_MSC_VER)
- # pragma warning(disable: 4189) // local variable is initialized but not referenced.
- # pragma warning(disable: 4127) // conditional expression is constant.
- # pragma warning(disable: 4100) // unreferenced formal parameter.
- # pragma warning(disable: 4714) // marked as __forceinline not #endif
- # pragma warning(disable: 4706)
- # pragma warning(disable: 4005)
- # pragma warning(disable: 4459) // declaration hides global declaration
- # pragma warning(disable: 4456) // declaration hides previous local declaration
- #endif
- //[change_declaration
- struct change
- {
- enum value_type { no, up, dn };
- change(value_type v =no) : value_(v) {}
- bool operator==(change v) const { return value_ == v.value_; }
- value_type value() const { return value_; }
- private: value_type value_;
- };
- //]
- //[change_stream_operators
- std::istream& operator>>(std::istream& stream, change& chg)
- {
- std::string str; stream >> str;
- /**/ if (str == "up") chg = change::up;
- else if (str == "dn") chg = change::dn;
- else if (str == "no") chg = change::no;
- else stream.setstate(std::ios_base::failbit);
- return stream;
- }
- std::ostream& operator<<(std::ostream& stream, change const& chg)
- {
- return stream << (chg == change::up ? "up" : chg == change::dn ? "dn" : "no");
- }
- //]
- //[change_convert_operators
- inline void operator>>(change chg, boost::optional<std::string>& str)
- {
- str = chg == change::up ? "up" : chg == change::dn ? "dn" : "no";
- }
- inline void operator>>(std::string const& str, boost::optional<change>& chg)
- {
- /**/ if (str == "up") chg = change::up;
- else if (str == "dn") chg = change::dn;
- else if (str == "no") chg = change::no;
- }
- //]
- //[direction_declaration
- struct direction
- {
- // Note: the class does NOT have the default constructor.
- enum value_type { up, dn };
- direction(value_type value) : value_(value) {}
- bool operator==(direction that) const { return value_ == that.value_; }
- value_type value() const { return value_; }
- private: value_type value_;
- };
- //]
- //[direction_stream_operators
- std::istream& operator>>(std::istream& stream, direction& dir)
- {
- std::string str; stream >> str;
- /**/ if (str == "up") dir = direction::up;
- else if (str == "dn") dir = direction::dn;
- else stream.setstate(std::ios_base::failbit);
- return stream;
- }
- std::ostream& operator<<(std::ostream& stream, direction const& dir)
- {
- return stream << (dir.value() == direction::up ? "up" : "dn");
- }
- //]
- //[direction_declaration_make_default
- namespace boost
- {
- template<> inline direction make_default<direction>()
- {
- return direction(direction::up);
- }
- }
- //]
- // Quick and dirty small-string implementation for performance tests.
- //[my_string_declaration
- struct my_string
- {
- typedef my_string this_type;
- typedef char value_type;
- typedef value_type* iterator;
- typedef value_type const* const_iterator;
- my_string ();
- my_string (const_iterator, const_iterator =0);
- char const* c_str () const { return storage_; }
- const_iterator begin () const { return storage_; }
- const_iterator end () const { return storage_ + strlen(storage_); }
- this_type& operator= (char const*);
- private:
- static size_t const size_ = 12;
- char storage_[size_];
- };
- //]
- inline
- my_string::my_string()
- {
- storage_[0] = 0;
- }
- inline
- my_string::my_string(const_iterator beg, const_iterator end)
- {
- std::size_t const sz = end ? (end - beg) : strlen(beg);
- BOOST_ASSERT(sz < size_);
- memcpy(storage_, beg, sz); storage_[sz] = 0;
- }
- inline
- my_string&
- my_string::operator=(char const* str)
- {
- BOOST_ASSERT(strlen(str) < size_);
- strcpy(storage_, str);
- return *this;
- }
- inline bool operator==(char const* s1, my_string const& s2) { return strcmp(s1, s2.c_str()) == 0; }
- inline bool operator==(my_string const& s1, char const* s2) { return strcmp(s2, s1.c_str()) == 0; }
- namespace test
- {
- struct cnv
- {
- #if defined(__QNXNTO__)
- static bool const is_qnx = true;
- #else
- static bool const is_qnx = false;
- #endif
- #if defined(_MSC_VER) && _MSC_VER < 1900
- static bool const is_msc = true;
- static bool const is_old_msc = true;
- #elif defined(_MSC_VER)
- static bool const is_msc = true;
- static bool const is_old_msc = false;
- #elif defined(__MINGW32__)
- static bool const is_msc = true;
- static bool const is_old_msc = true;
- #else
- static bool const is_msc = false;
- static bool const is_old_msc = false;
- #endif
- };
- }
- #endif // BOOST_CONVERT_TEST_HPP
|