カウンタ 〜その4〜

一応、形にはなったのでうp。
基本的な使い方は以下の通り。

#include <assert.h>

#include "counter.hpp"
#include "counter_compare.hpp"

int
main(){
    
    // 増減値を設定したり、最大最小の設定が出来る基本的なカウンタ
    counter<int>    basic_counter(0);    // int 型の値をカウントするカウンタ
    basic_counter.set_increment(1);        // counter<T>::increment() した際に加算される値を設定
    basic_counter.set_decrement(1);        // counter<T>::decrement() した際に減算される値を設定
    basic_counter.get_max_checker().value(10);    // 最大の値
    basic_counter.get_min_checker().value(-10);    // 最小の値

    for( int i = 0 ; i < 20 ; i++ ){
        basic_counter.increment();
        assert( basic_counter <= 10 );
    }
    for( int i = 0 ; i < 20 ; i++ ){
        basic_counter.decrement();
        assert( basic_counter >= -10 );
    }

    // 最大、最小の制限がないカウンタ
    custom_counter<int, int, int, counters::through, counters::through>    unlimited_counter(0);
    unlimited_counter.set_increment(1);
    unlimited_counter.set_decrement(1);
    
    for( int i = 0 ; i < 10000 ; i++ ){
        assert(unlimited_counter == i);
        unlimited_counter.increment();
    }
    
    unlimited_counter.value(0);
    for( int i = 0 ; i > -10000 ; i-- ){
        assert(unlimited_counter == i);
        unlimited_counter.decrement();
    }

    // 加算だけ行い、上限があるカウンタ
    custom_counter<
        int,
        int,
        counters::empty,
        counters::max_stop<int>,
        counters::through
    > accelerator(0);
    accelerator.set_increment(2);
    accelerator.get_max_checker().value(50);

    for( int i = 0 ; i < 100 ; i++ ){
        accelerator.increment();
    }
    assert(accelerator == 50);

    return 0;
}

基本的には、counter を用いてカウンタの管理を行い、
用途に合わせて使い分けたければ、custom_counter を用いて、自前で定義する感じ。
増減時の処理やインクリメント値を全部テンプレートで定義するので引数が多いです。
色々とツッコミどころはあるけど大まかにやりたかった事が出来たのでそれなりに満足。
初期化しないとゴミが入っていたり、初期化が手間だったりするのでそこはなんとかしたいんだけども…。
コンストラクタで各値を渡せば解決しそうなんだけどもさて。

以下、ヘッダーの中身。
長いです。

続きを読む