00001
00005 #pragma once
00006
00007 #include <usml/types/seq_vector.h>
00008
00009 namespace usml {
00010 namespace types {
00013
00018 class USML_DECLSPEC seq_log: public seq_vector {
00019
00020
00021
00022
00023 public:
00024
00034 virtual size_type find_index( value_type value ) {
00035 return (size_type) max(
00036 (difference_type) 0, min( (difference_type) size()-2,
00037 (difference_type) floor( (value - _data[0]) / _increment[0] )));
00038 }
00039
00040
00041
00042
00043 private:
00044
00052 void initialize( value_type first, value_type increment, size_type size ) {
00053 value_type v = first ;
00054 for (size_type n = 0; n < size; ++n) {
00055 _data[n] = v ;
00056 v *= increment ;
00057 if ( n > 0 ) {
00058 _increment[n-1] = _data[n] - _data[n-1];
00059 _increment[n] = _increment[n-1] ;
00060 }
00061 }
00062 }
00063
00064 public:
00065
00067 virtual ~seq_log() {}
00068
00076 seq_log( value_type first, value_type increment, size_type size ) :
00077 seq_vector( size )
00078 {
00079 initialize( first, increment, size ) ;
00080 }
00081
00089 seq_log( value_type first, value_type increment, int size ) :
00090 seq_vector( (size_type) size )
00091 {
00092 initialize( first, increment, (size_type) size ) ;
00093 }
00094
00105 seq_log( value_type first, value_type increment, value_type last ) :
00106 seq_vector( (increment == 1.0) ? 1
00107 : max((difference_type) 1, (difference_type) floor(1.0 + (log(
00108 last / first) / log(increment)))) )
00109 {
00110 initialize( first, increment, size() ) ;
00111 }
00112
00118 seq_log( const seq_log & copy ) : seq_vector( copy ) {
00119 }
00120
00122 virtual seq_vector* clone() const {
00123 return new seq_log( *this ) ;
00124 }
00125
00126
00127 };
00128
00130 }
00131 }