CLX C++ Libraries - constrained_value
Author: clown

CLX C++ Libraries
Home >> constrained_value

# Declarations

    template <class ConstrainedFunc>
    class constrained_value;

# Overview

constrained_value は，制約付きの値型を実現するためのクラスです． 代入演算子をオーバーロードすることによって，値の代入や四則演算が行われるたびに， 値が制約を満たしているか自動的にチェックします．制約は ConstrainedFunc に制約条件用のポリシークラスを指定することによってよって与えます． 独自に制約条件用のポリシークラスを定義する場合には，以下の型， およびメソッドを定義する必要があります．

    class constrained_func {
    public:
      typedef ... value_type;

      static void assign(value_type& dest, const value_type& src);
    };

尚，標準では代入された値が [Min, Max] の範囲外である場合には，std::ranged_error を例外として送出する ranged_integer と言う制約条件用ポリシークラスを提供しています．

    template <int Min, int Max>
    class ranged_integer {
    public:
        typedef int value_type;
        const static value_type default_value = Min;

        static void assign(value_type& dest, const value_type& src);
    };

代入，四則演算，および比較については，同じ ConstrainedFunc を適用しているオブジェクト， または，基となる型 (integer, double, ...) と行うことができます．

constrained_value は，C++ クックブック (p.194 - 197) をベースに実装しています．

# Example

example_constrained_value.cpp

    #include <iostream>
    #include "clx/constrained_value.h"

    int main(int argc, char* argv[])
    {
        clx::constrained_value<clx::ranged_integer<0, 100> > x;
        clx::constrained_value<clx::ranged_integer<0, 100> > y;
        clx::constrained_value<clx::ranged_integer<0, 50> > z;

        try {
            std::cout << "1st example." << std::endl;
            x = 32;
            std::cout << "x = " << x << std::endl;
            y = 8;
            std::cout << "y = " << y << std::endl;
            y += x + 51 - (2 * 4);
            std::cout << "y = " << y << std::endl;
        }
        catch (std::range_error& e) {
            std::cerr << "exception: " << e.what() << std::endl;
        }

        std::cout << std::endl;

        try {
            std::cout << "2nd example." << std::endl;
            x = 32;
            std::cout << "x = " << x << std::endl;
            z = 8;
            std::cout << "z = " << z << std::endl;
            z += z.value() + 51 - (2 * 4);
            std::cout << "z = " << z << std::endl;
        }
        catch (std::range_error& e) {
            std::cerr << "exception: " << e.what() << std::endl;
        }

        return 0;
    }

    Result
    1st example.
    x = 32
    y = 8
    y = 83

    2nd example.
    x = 32
    z = 8
    exception: out of valied range

# Template Parameters

ConstrainedFunc
  制約条件を記述したポリシークラスを指定します．

# Related Types

    typedef ConstrainedFunc func;
    typedef typename ConstrainedFunc::value_type value_type;

# Construction and Member Functions

    constrained_value();
    constrained_value(const constrained_value& x);
    explicit constrained_value(const value_type& x);
    virtual ~constrained_value();

    const value_type& value() const;

# Operators

    constrained_value& operator=(const constrained_value& x);
    constrained_value& operator+=(const constrained_value& x);
    constrained_value& operator-=(const constrained_value& x);
    constrained_value& operator*=(const constrained_value& x);
    constrained_value& operator/=(const constrained_value& x);
    constrained_value& operator%=(const constrained_value& x);
    constrained_value& operator=(const value_type& x);
    constrained_value& operator+=(const value_type& x);
    constrained_value& operator-=(const value_type& x);
    constrained_value& operator*=(const value_type& x);
    constrained_value& operator/=(const value_type& x);
    constrained_value& operator%=(const value_type& x);
    constrained_value& operator>>=(int x);
    constrained_value& operator<<=(int x);

## Unary Operators

    constrained_value operator-();
    constrained_value operator+();
    constrained_value operator!();
    constrained_value operator~();

## Binary Operators

    friend constrained_value operator+(constrained_value x, const constrained_value& y);
    friend constrained_value operator-(constrained_value x, const constrained_value& y);
    friend constrained_value operator*(constrained_value x, const constrained_value& y);
    friend constrained_value operator/(constrained_value x, const constrained_value& y);
    friend constrained_value operator%(constrained_value x, const constrained_value& y);

    friend constrained_value operator+(constrained_value x, const value_type& y);
    friend constrained_value operator-(constrained_value x, const value_type& y);
    friend constrained_value operator*(constrained_value x, const value_type& y);
    friend constrained_value operator/(constrained_value x, const value_type& y);
    friend constrained_value operator%(constrained_value x, const value_type& y);
    friend constrained_value operator+(const value_type& y, constrained_value x);
    friend constrained_value operator-(const value_type& y, constrained_value x);
    friend constrained_value operator*(const value_type& y, constrained_value x);
    friend constrained_value operator/(const value_type& y, constrained_value x);
    friend constrained_value operator%(const value_type& y, constrained_value x);

    friend constrained_value operator>>(constrained_value x, int y);
    friend constrained_value operator<<(constrained_value x, int y);

## Stream Operators

    template <class Ch, class Tr>
    friend std::basic_ostream<Ch, Tr>& operator<<(
      std::basic_ostream<Ch, Tr>& sout, constrained_value x);

    template <class Ch, class Tr>
    friend std::basic_istream<Ch, Tr>& operator>>(
      std::basic_istream<Ch, Tr>& sin, constrained_value x);

## Comparison Operators

    friend bool operator<(const constrained_value& x, const constrained_value& y);
    friend bool operator>(const constrained_value& x, const constrained_value& y);
    friend bool operator<=(const constrained_value& x, const constrained_value& y);
    friend bool operator>=(const constrained_value& x, const constrained_value& y);
    friend bool operator==(const constrained_value& x, const constrained_value& y);
    friend bool operator!=(const constrained_value& x, const constrained_value& y);

    friend bool operator<(const constrained_value& x, const value_type& y);
    friend bool operator>(const constrained_value& x, const value_type& y);
    friend bool operator<=(const constrained_value& x, const value_type& y);
    friend bool operator>=(const constrained_value& x, const value_type& y);
    friend bool operator==(const constrained_value& x, const value_type& y);
    friend bool operator!=(const constrained_value& x, const value_type& y);
    friend bool operator<(const value_type& y, const constrained_value& x);
    friend bool operator>(const value_type& y, const constrained_value& x);
    friend bool operator<=(const value_type& y, const constrained_value& x);
    friend bool operator>=(const value_type& y, const constrained_value& x);
    friend bool operator==(const value_type& y, const constrained_value& x);
    friend bool operator!=(const value_type& y, const constrained_value& x);

# References

1. D. Ryan Stephens, Christopher Diggins, Janathan Turkanis, and Jeff Cogswell (株式会社クイープ訳), "C++ クックブック," 株式会社オライリー・ジャパン, 2006.