Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // width.hpp Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_XPRESSIVE_DETAIL_UTILITY_WIDTH_HPP_EAN_04_07_2006 Chris@16: #define BOOST_XPRESSIVE_DETAIL_UTILITY_WIDTH_HPP_EAN_04_07_2006 Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include // for INT_MAX Chris@16: #include Chris@16: Chris@16: namespace boost { namespace xpressive { namespace detail Chris@16: { Chris@16: Chris@16: typedef mpl::size_t unknown_width; Chris@16: struct width; Chris@16: bool is_unknown(width const &that); Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // width Chris@16: struct width Chris@16: { Chris@16: width(std::size_t val = 0) Chris@16: : value_(val) Chris@16: { Chris@16: } Chris@16: Chris@16: bool operator !() const Chris@16: { Chris@16: return !this->value_; Chris@16: } Chris@16: Chris@16: width &operator +=(width const &that) Chris@16: { Chris@16: this->value_ = Chris@16: !is_unknown(*this) && !is_unknown(that) Chris@16: ? this->value_ + that.value_ Chris@16: : unknown_width(); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: width &operator |=(width const &that) Chris@16: { Chris@16: this->value_ = Chris@16: this->value_ == that.value_ Chris@16: ? this->value_ Chris@16: : unknown_width(); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: std::size_t value() const Chris@16: { Chris@16: return this->value_; Chris@16: } Chris@16: Chris@16: private: Chris@16: std::size_t value_; Chris@16: }; Chris@16: Chris@16: inline bool is_unknown(width const &that) Chris@16: { Chris@16: return unknown_width::value == that.value(); Chris@16: } Chris@16: Chris@16: inline bool operator ==(width const &left, width const &right) Chris@16: { Chris@16: return left.value() == right.value(); Chris@16: } Chris@16: Chris@16: inline bool operator !=(width const &left, width const &right) Chris@16: { Chris@16: return left.value() != right.value(); Chris@16: } Chris@16: Chris@16: inline width operator +(width left, width const &right) Chris@16: { Chris@16: return left += right; Chris@16: } Chris@16: Chris@16: inline width operator |(width left, width const &right) Chris@16: { Chris@16: return left |= right; Chris@16: } Chris@16: Chris@16: }}} // namespace boost::xpressive::detail Chris@16: Chris@16: #endif