///////////////////////////////////////////////////////////////////////////////
// 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
