163 lines
5.1 KiB
C++
163 lines
5.1 KiB
C++
// Copyright (C) 2003 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_CONDITIONING_CLASS_KERNEl_C_
|
|
#define DLIB_CONDITIONING_CLASS_KERNEl_C_
|
|
|
|
#include "conditioning_class_kernel_abstract.h"
|
|
#include "../algs.h"
|
|
#include "../assert.h"
|
|
#include <iostream>
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
template <
|
|
typename cc_base
|
|
>
|
|
class conditioning_class_kernel_c : public cc_base
|
|
{
|
|
const unsigned long alphabet_size;
|
|
|
|
public:
|
|
|
|
conditioning_class_kernel_c (
|
|
typename cc_base::global_state_type& global_state
|
|
) : cc_base(global_state),alphabet_size(cc_base::get_alphabet_size()) {}
|
|
|
|
bool increment_count (
|
|
unsigned long symbol,
|
|
unsigned short amount = 1
|
|
);
|
|
|
|
unsigned long get_count (
|
|
unsigned long symbol
|
|
) const;
|
|
|
|
unsigned long get_range (
|
|
unsigned long symbol,
|
|
unsigned long& low_count,
|
|
unsigned long& high_count,
|
|
unsigned long& total_count
|
|
) const;
|
|
|
|
void get_symbol (
|
|
unsigned long target,
|
|
unsigned long& symbol,
|
|
unsigned long& low_count,
|
|
unsigned long& high_count
|
|
) const;
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
// member function definitions
|
|
// ----------------------------------------------------------------------------------------
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename cc_base
|
|
>
|
|
bool conditioning_class_kernel_c<cc_base>::
|
|
increment_count (
|
|
unsigned long symbol,
|
|
unsigned short amount
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT(symbol < alphabet_size &&
|
|
0 < amount && amount < 32768,
|
|
"\tvoid conditioning_class::increment_count()"
|
|
<< "\n\tthe symbol must be in the range 0 to alphabet_size-1. and"
|
|
<< "\n\tamount must be in the range 1 to 32767"
|
|
<< "\n\talphabet_size: " << alphabet_size
|
|
<< "\n\tsymbol: " << symbol
|
|
<< "\n\tamount: " << amount
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
// call the real function
|
|
return cc_base::increment_count(symbol,amount);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename cc_base
|
|
>
|
|
unsigned long conditioning_class_kernel_c<cc_base>::
|
|
get_count (
|
|
unsigned long symbol
|
|
) const
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT(symbol < alphabet_size,
|
|
"\tvoid conditioning_class::get_count()"
|
|
<< "\n\tthe symbol must be in the range 0 to alphabet_size-1"
|
|
<< "\n\talphabet_size: " << alphabet_size
|
|
<< "\n\tsymbol: " << symbol
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
// call the real function
|
|
return cc_base::get_count(symbol);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename cc_base
|
|
>
|
|
unsigned long conditioning_class_kernel_c<cc_base>::
|
|
get_range (
|
|
unsigned long symbol,
|
|
unsigned long& low_count,
|
|
unsigned long& high_count,
|
|
unsigned long& total_count
|
|
) const
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT(symbol < alphabet_size,
|
|
"\tvoid conditioning_class::get_range()"
|
|
<< "\n\tthe symbol must be in the range 0 to alphabet_size-1"
|
|
<< "\n\talphabet_size: " << alphabet_size
|
|
<< "\n\tsymbol: " << symbol
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
// call the real function
|
|
return cc_base::get_range(symbol,low_count,high_count,total_count);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <
|
|
typename cc_base
|
|
>
|
|
void conditioning_class_kernel_c<cc_base>::
|
|
get_symbol (
|
|
unsigned long target,
|
|
unsigned long& symbol,
|
|
unsigned long& low_count,
|
|
unsigned long& high_count
|
|
) const
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_CASSERT( target < this->get_total(),
|
|
"\tvoid conditioning_class::get_symbol()"
|
|
<< "\n\tthe target must be in the range 0 to get_total()-1"
|
|
<< "\n\tget_total(): " << this->get_total()
|
|
<< "\n\ttarget: " << target
|
|
<< "\n\tthis: " << this
|
|
);
|
|
|
|
// call the real function
|
|
cc_base::get_symbol(target,symbol,low_count,high_count);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_CONDITIONING_CLASS_KERNEl_C_
|
|
|