533 lines
17 KiB
C
533 lines
17 KiB
C
|
//===========================================================================//
|
||
|
// Purpose : Template version for a TCT_OrderedVector2D ordered vector class.
|
||
|
//
|
||
|
// Inline methods include:
|
||
|
// - GetWidth
|
||
|
// - GetHeight
|
||
|
// - IsValid
|
||
|
//
|
||
|
// Public methods include:
|
||
|
// - TCT_OrderedVector2D_c, ~TCT_OrderedVector2D_c
|
||
|
// - operator=
|
||
|
// - operator==, operator!=
|
||
|
// - operator[], operator()
|
||
|
// - Print
|
||
|
// - ExtractString
|
||
|
// - SetCapacity
|
||
|
// - Clear
|
||
|
//
|
||
|
//===========================================================================//
|
||
|
|
||
|
#ifndef TCT_ORDERED_VECTOR_2D_H
|
||
|
#define TCT_ORDERED_VECTOR_2D_H
|
||
|
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include <vector>
|
||
|
#include <iterator>
|
||
|
#include <algorithm>
|
||
|
|
||
|
#include <string>
|
||
|
using namespace std;
|
||
|
|
||
|
#include "TIO_Typedefs.h"
|
||
|
|
||
|
#include "TCT_Generic.h"
|
||
|
|
||
|
#include "TC_Typedefs.h"
|
||
|
#include "TC_MinGrid.h"
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Purpose : Class declaration
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > class TCT_OrderedVector2D_c
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
TCT_OrderedVector2D_c( size_t width = TC_DEFAULT_CAPACITY,
|
||
|
size_t height = TC_DEFAULT_CAPACITY,
|
||
|
const T* pdata = 0 );
|
||
|
TCT_OrderedVector2D_c( size_t width,
|
||
|
size_t height,
|
||
|
const T& data );
|
||
|
TCT_OrderedVector2D_c( const TCT_OrderedVector2D_c& orderedVector2D );
|
||
|
~TCT_OrderedVector2D_c( void );
|
||
|
|
||
|
TCT_OrderedVector2D_c& operator=( const TCT_OrderedVector2D_c& orderedVector2D );
|
||
|
|
||
|
bool operator==( const TCT_OrderedVector2D_c& orderedVector2D ) const;
|
||
|
bool operator!=( const TCT_OrderedVector2D_c& orderedVector2D ) const;
|
||
|
|
||
|
T* operator[]( size_t index );
|
||
|
T* operator[]( size_t index ) const;
|
||
|
|
||
|
T* operator()( size_t i, size_t j );
|
||
|
T* operator()( size_t i, size_t j ) const;
|
||
|
|
||
|
void Print( FILE* pfile = stdout, size_t spaceLen = 0 ) const;
|
||
|
|
||
|
void ExtractString( TC_DataMode_t mode,
|
||
|
string* psrData,
|
||
|
size_t precision = SIZE_MAX,
|
||
|
size_t maxLen = INT_MAX,
|
||
|
size_t spaceLen = 0,
|
||
|
size_t firstLen = SIZE_MAX ) const;
|
||
|
|
||
|
void SetCapacity( size_t width,
|
||
|
size_t height,
|
||
|
const T* pdata = 0 );
|
||
|
void SetCapacity( size_t width,
|
||
|
size_t height,
|
||
|
const T& data );
|
||
|
size_t GetWidth( void ) const;
|
||
|
size_t GetHeight( void ) const;
|
||
|
|
||
|
T* At( size_t i, size_t j );
|
||
|
T* At( size_t i, size_t j ) const;
|
||
|
|
||
|
void Clear( void );
|
||
|
|
||
|
bool IsValid( void ) const;
|
||
|
|
||
|
private:
|
||
|
|
||
|
size_t width_;
|
||
|
size_t height_;
|
||
|
std::vector< std::vector< T > > vector2D_;
|
||
|
};
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Purpose : Class inline definition(s)
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > inline size_t TCT_OrderedVector2D_c< T >::GetWidth(
|
||
|
void ) const
|
||
|
{
|
||
|
return( this->width_ );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > inline size_t TCT_OrderedVector2D_c< T >::GetHeight(
|
||
|
void ) const
|
||
|
{
|
||
|
return( this->height_ );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > inline bool TCT_OrderedVector2D_c< T >::IsValid(
|
||
|
void ) const
|
||
|
{
|
||
|
return(( this->GetWidth( ) > 0 ) && ( this->GetHeight( ) > 0 ) ?
|
||
|
true : false );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : TCT_OrderedVector2D_c
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > TCT_OrderedVector2D_c< T >::TCT_OrderedVector2D_c(
|
||
|
size_t width,
|
||
|
size_t height,
|
||
|
const T* pdata )
|
||
|
:
|
||
|
width_( width ),
|
||
|
height_( height )
|
||
|
{
|
||
|
this->SetCapacity( width, height, pdata );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > TCT_OrderedVector2D_c< T >::TCT_OrderedVector2D_c(
|
||
|
size_t width,
|
||
|
size_t height,
|
||
|
const T& data )
|
||
|
:
|
||
|
width_( width ),
|
||
|
height_( height )
|
||
|
{
|
||
|
this->SetCapacity( width, height, data );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > TCT_OrderedVector2D_c< T >::TCT_OrderedVector2D_c(
|
||
|
const TCT_OrderedVector2D_c& orderedVector2D )
|
||
|
:
|
||
|
width_( orderedVector2D.width_ ),
|
||
|
height_( orderedVector2D.height_ ),
|
||
|
vector2D_( orderedVector2D.vector2D_ )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : ~TCT_OrderedVector2D_c
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > TCT_OrderedVector2D_c< T >::~TCT_OrderedVector2D_c(
|
||
|
void )
|
||
|
{
|
||
|
this->Clear( );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : operator==
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > TCT_OrderedVector2D_c< T >& TCT_OrderedVector2D_c< T >::operator=(
|
||
|
const TCT_OrderedVector2D_c& orderedVector2D )
|
||
|
{
|
||
|
this->width_ = orderedVector2D.width_;
|
||
|
this->height_ = orderedVector2D.height_;
|
||
|
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
this->vector2D_[i].operator=( orderedVector2D.vector2D_[i] );
|
||
|
}
|
||
|
this->vector2D_.operator=( orderedVector2D.vector2D_ );
|
||
|
|
||
|
return( *this );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : operator==
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > bool TCT_OrderedVector2D_c< T >::operator==(
|
||
|
const TCT_OrderedVector2D_c& orderedVector2D ) const
|
||
|
{
|
||
|
bool isEqual = ( this->width_ == orderedVector2D.width_ ) &&
|
||
|
( this->height_ == orderedVector2D.height_ ) ?
|
||
|
true : false;
|
||
|
if ( isEqual )
|
||
|
{
|
||
|
for ( size_t j = 0; j < this->height_; ++j )
|
||
|
{
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
isEqual = ( this->vector2D_[i][j] == orderedVector2D[i][j] ) ?
|
||
|
true : false;
|
||
|
if ( !isEqual )
|
||
|
break;
|
||
|
}
|
||
|
if ( !isEqual )
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return( isEqual );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : operator!=
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > bool TCT_OrderedVector2D_c< T >::operator!=(
|
||
|
const TCT_OrderedVector2D_c& orderedVector2D ) const
|
||
|
{
|
||
|
return( !this->operator==( orderedVector2D ) ? true : false );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : operator[]
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::operator[](
|
||
|
size_t index )
|
||
|
{
|
||
|
T* pdata = 0;
|
||
|
|
||
|
if ( index < TCT_Max( this->width_, this->height_ ))
|
||
|
{
|
||
|
pdata = &this->vector2D_.operator[]( index ).operator[]( 0 );
|
||
|
}
|
||
|
return( pdata );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::operator[](
|
||
|
size_t index ) const
|
||
|
{
|
||
|
T* pdata = const_cast< TCT_OrderedVector2D_c< T >* >( this )->operator[]( index );
|
||
|
|
||
|
return( pdata );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : operator()
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::operator()(
|
||
|
size_t i,
|
||
|
size_t j )
|
||
|
{
|
||
|
return( this->At( i, j ));
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::operator()(
|
||
|
size_t i,
|
||
|
size_t j ) const
|
||
|
{
|
||
|
return( this->At( i, j ));
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : Print
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > void TCT_OrderedVector2D_c< T >::Print(
|
||
|
FILE* pfile,
|
||
|
size_t spaceLen ) const
|
||
|
{
|
||
|
for ( size_t j = 0; j < this->height_; ++j )
|
||
|
{
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
const T& data = *this->At( i, j );
|
||
|
if ( data.IsValid( ))
|
||
|
{
|
||
|
data.Print( pfile, spaceLen );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : ExtractString
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > void TCT_OrderedVector2D_c< T >::ExtractString(
|
||
|
TC_DataMode_t mode,
|
||
|
string* psrData,
|
||
|
size_t precision,
|
||
|
size_t maxLen,
|
||
|
size_t spaceLen,
|
||
|
size_t firstLen ) const
|
||
|
{
|
||
|
if ( psrData )
|
||
|
{
|
||
|
*psrData = "";
|
||
|
|
||
|
if ( precision == SIZE_MAX )
|
||
|
{
|
||
|
TC_MinGrid_c& minGrid = TC_MinGrid_c::GetInstance( );
|
||
|
precision = minGrid.GetPrecision( );
|
||
|
}
|
||
|
|
||
|
if ( firstLen == SIZE_MAX )
|
||
|
{
|
||
|
firstLen = spaceLen;
|
||
|
}
|
||
|
|
||
|
for ( size_t j = 0; j < this->height_; ++j )
|
||
|
{
|
||
|
if (( j == 0 ) && ( firstLen > 0 ))
|
||
|
{
|
||
|
char szFirstText[ TIO_FORMAT_STRING_LEN_MAX ];
|
||
|
sprintf( szFirstText, "%*s", firstLen, firstLen ? " " : "" );
|
||
|
*psrData += szFirstText;
|
||
|
}
|
||
|
else if (( j > 0 ) && ( spaceLen > 0 ))
|
||
|
{
|
||
|
char szSpaceText[ TIO_FORMAT_STRING_LEN_MAX ];
|
||
|
sprintf( szSpaceText, "%*s", spaceLen, spaceLen ? " " : "" );
|
||
|
*psrData += szSpaceText;
|
||
|
}
|
||
|
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
int iDataValue;
|
||
|
unsigned int uiDataValue;
|
||
|
long lDataValue;
|
||
|
unsigned long ulDataValue;
|
||
|
size_t sDataValue;
|
||
|
double fDataValue;
|
||
|
double eDataValue;
|
||
|
string srDataValue;
|
||
|
|
||
|
char szDataString[ TIO_FORMAT_STRING_LEN_DATA ];
|
||
|
memset( szDataString, 0, sizeof( szDataString ));
|
||
|
|
||
|
switch( mode )
|
||
|
{
|
||
|
case TC_DATA_INT:
|
||
|
iDataValue = *reinterpret_cast< int* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%d", iDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_UINT:
|
||
|
uiDataValue = *reinterpret_cast< unsigned int* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%u", uiDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_LONG:
|
||
|
lDataValue = *reinterpret_cast< long* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%ld", lDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_ULONG:
|
||
|
ulDataValue = *reinterpret_cast< unsigned long* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%lu", ulDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_SIZE:
|
||
|
sDataValue = *reinterpret_cast< size_t* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%lu", sDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_FLOAT:
|
||
|
fDataValue = *reinterpret_cast< double* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%0.*f", precision, fDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_EXP:
|
||
|
eDataValue = *reinterpret_cast< double* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%0.*e", precision + 1, eDataValue );
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_STRING:
|
||
|
srDataValue = *reinterpret_cast< string* >( this->At( i, j ));
|
||
|
sprintf( szDataString, "%.*s", sizeof( szDataString ) - 1, srDataValue.data( ));
|
||
|
break;
|
||
|
|
||
|
case TC_DATA_UNDEFINED:
|
||
|
sprintf( szDataString, "?" );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
size_t lenDataString = TCT_Max( strlen( szDataString ), strlen( "..." ));
|
||
|
if ( psrData->length( ) + lenDataString >= maxLen )
|
||
|
{
|
||
|
*psrData += "...";
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
*psrData += szDataString;
|
||
|
*psrData += ( i < this->width_ - 1 ? " " : "" );
|
||
|
}
|
||
|
*psrData += "\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : SetCapacity
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > void TCT_OrderedVector2D_c< T >::SetCapacity(
|
||
|
size_t width,
|
||
|
size_t height,
|
||
|
const T* pdata )
|
||
|
{
|
||
|
this->width_ = width;
|
||
|
this->height_ = height;
|
||
|
|
||
|
T data;
|
||
|
if ( pdata )
|
||
|
data = *pdata;
|
||
|
|
||
|
this->vector2D_.resize( this->width_ );
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
this->vector2D_[i].resize( this->height_ );
|
||
|
for ( size_t j = 0; j < this->height_; ++j )
|
||
|
{
|
||
|
this->vector2D_[i][j] = data;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > void TCT_OrderedVector2D_c< T >::SetCapacity(
|
||
|
size_t width,
|
||
|
size_t height,
|
||
|
const T& data )
|
||
|
{
|
||
|
this->SetCapacity( width, height, &data );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : At
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::At(
|
||
|
size_t i,
|
||
|
size_t j )
|
||
|
{
|
||
|
T* pdata = 0;
|
||
|
|
||
|
if (( i < this->width_ ) && ( j < this->height_ ))
|
||
|
{
|
||
|
std::vector< T >& vector1D_ = this->vector2D_[i];
|
||
|
pdata = &vector1D_[j];
|
||
|
}
|
||
|
return( pdata );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
template< class T > T* TCT_OrderedVector2D_c< T >::At(
|
||
|
size_t i,
|
||
|
size_t j ) const
|
||
|
{
|
||
|
T* pdata = const_cast< TCT_OrderedVector2D_c< T >* >( this )->At( i, j );
|
||
|
|
||
|
return( pdata );
|
||
|
}
|
||
|
|
||
|
//===========================================================================//
|
||
|
// Method : Clear
|
||
|
// Author : Jeff Rudolph
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// Version history
|
||
|
// 05/15/12 jeffr : Original
|
||
|
//===========================================================================//
|
||
|
template< class T > void TCT_OrderedVector2D_c< T >::Clear(
|
||
|
void )
|
||
|
{
|
||
|
for ( size_t i = 0; i < this->width_; ++i )
|
||
|
{
|
||
|
this->vector2D_[i].clear( );
|
||
|
}
|
||
|
this->vector2D_.clear( );
|
||
|
}
|
||
|
|
||
|
#endif
|