Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/xpressive/detail/utility/width.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/xpressive/detail/utility/width.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////// +// width.hpp +// +// Copyright 2008 Eric Niebler. Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_WIDTH_HPP_EAN_04_07_2006 +#define BOOST_XPRESSIVE_DETAIL_UTILITY_WIDTH_HPP_EAN_04_07_2006 + +// MS compatible compilers support #pragma once +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#include <climits> // for INT_MAX +#include <boost/mpl/size_t.hpp> + +namespace boost { namespace xpressive { namespace detail +{ + +typedef mpl::size_t<INT_MAX / 2 - 1> unknown_width; +struct width; +bool is_unknown(width const &that); + +/////////////////////////////////////////////////////////////////////////////// +// width +struct width +{ + width(std::size_t val = 0) + : value_(val) + { + } + + bool operator !() const + { + return !this->value_; + } + + width &operator +=(width const &that) + { + this->value_ = + !is_unknown(*this) && !is_unknown(that) + ? this->value_ + that.value_ + : unknown_width(); + return *this; + } + + width &operator |=(width const &that) + { + this->value_ = + this->value_ == that.value_ + ? this->value_ + : unknown_width(); + return *this; + } + + std::size_t value() const + { + return this->value_; + } + +private: + std::size_t value_; +}; + +inline bool is_unknown(width const &that) +{ + return unknown_width::value == that.value(); +} + +inline bool operator ==(width const &left, width const &right) +{ + return left.value() == right.value(); +} + +inline bool operator !=(width const &left, width const &right) +{ + return left.value() != right.value(); +} + +inline width operator +(width left, width const &right) +{ + return left += right; +} + +inline width operator |(width left, width const &right) +{ + return left |= right; +} + +}}} // namespace boost::xpressive::detail + +#endif