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_linear : public seq_vector {
00019
00020 public:
00021
00031 seq_linear( value_type first, value_type temp, size_type size, bool first_last=false ) :
00032 seq_vector( size )
00033 {
00034 value_type increment ;
00035 increment = first_last ? ( temp - first ) / size : temp ;
00036 initialize( first, increment, size ) ;
00037 }
00038
00046 seq_linear( value_type first, value_type increment, int size ) :
00047 seq_vector( (size_type) size )
00048 {
00049 initialize( first, increment, (size_type) size ) ;
00050 }
00051
00062 seq_linear( value_type first, value_type increment, value_type last ) :
00063 seq_vector( (increment == 0.0) ? 1 : max(
00064 (difference_type) 1,
00065 (difference_type) floor(1.0+(last-first)/increment)))
00066 {
00067 initialize( first, increment, size() ) ;
00068 }
00069
00075 seq_linear( const seq_linear & copy ) : seq_vector( copy ) {
00076 }
00077
00079 virtual ~seq_linear() {}
00080
00081
00082
00083
00085 virtual seq_vector* clone() const {
00086 return new seq_linear( *this ) ;
00087 }
00088
00098 virtual size_type find_index( value_type value ) {
00099 return (size_type) max(
00100 (difference_type) 0, min( (difference_type) this->size()-2,
00101 (difference_type) floor( (value - _data[0]) / _increment[0]) ));
00102 }
00103
00104
00105
00106
00107 private:
00115 void initialize( value_type first, value_type increment, size_type size ) {
00116 value_type v = first ;
00117 for (size_type n = 0; n < size; ++n) {
00118 _data[n] = v ;
00119 _increment[n] = increment ;
00120 v += increment ;
00121 }
00122 }
00123 };
00124
00126 }
00127 }