25 #ifndef __TERRALIB_RP_INTERNAL_MATRIX_H 
   26 #define __TERRALIB_RP_INTERNAL_MATRIX_H 
   30   #include "../common/PlatformUtils.h" 
   39   #include <boost/scoped_array.hpp> 
   40   #include <boost/filesystem.hpp> 
   50       template< 
typename TemplateElementType >
 
  111           bool reset( 
unsigned int lines, 
unsigned int columns );      
 
  123           bool reset( 
unsigned int lines, 
unsigned int columns,
 
  138           bool reset( 
unsigned int lines, 
unsigned int columns,
 
  139             MemoryPolicy memoryPolicy, 
unsigned char maxMemPercentUsage );             
 
  154           bool reset( 
unsigned int lines, 
unsigned int columns,
 
  155             MemoryPolicy memoryPolicy, 
unsigned long int maxTmpFileSize,
 
  156             unsigned char maxMemPercentUsage ); 
 
  204             const unsigned int& line, 
 
  205             const unsigned int& column )
 
  221             const unsigned int& line, 
 
  222             const unsigned int& column )
 const 
  242             const unsigned int& line )
 
  259             const unsigned int& line )
 const 
  405             const unsigned int& line ) 
const;
 
  415             std::string& fullFileName ) 
const;      
 
  418       template< 
typename TemplateElementType >
 
  425       template< 
typename TemplateElementType >
 
  430       template< 
typename TemplateElementType >
 
  436       template< 
typename TemplateElementType >
 
  441           remove( m_fullFileName.c_str() );
 
  446       template< 
typename TemplateElementType >
 
  458       template< 
typename TemplateElementType >
 
  464       template< 
typename TemplateElementType >
 
  473       template< 
typename TemplateElementType >
 
  479       template< 
typename TemplateElementType >
 
  485       template< 
typename TemplateElementType >
 
  491       template< 
typename TemplateElementType >
 
  493         unsigned int columns )
 
  499       template< 
typename TemplateElementType >
 
  507       template< 
typename TemplateElementType >
 
  510         unsigned char maxMemPercentUsage )
 
  513           maxMemPercentUsage );
 
  516       template< 
typename TemplateElementType >
 
  519         unsigned long int maxTmpFileSize,
 
  520         unsigned char maxMemPercentUsage )
 
  532         if( ( lines > 0 ) && ( columns > 0 ) )
 
  541             const unsigned int lineSizeBytes = (
unsigned int)(
 
  553               TemplateElementType* newLinePtr = 0;
 
  555               for( 
unsigned int allLinesPtrsVecIdx = 0 ; allLinesPtrsVecIdx <
 
  577               unsigned int maxRAMLines = 1;
 
  589                 const double freeVMem = 
MIN( totalPhysMem, 
 
  590                   ( totalVMem - usedVMem ) );
 
  595                 maxRAMLines = (
unsigned int)
MAX( 1.0, linesMem / 
 
  596                   ((
double)lineSizeBytes) );
 
  601               const unsigned int ramLinesIndexesVecSize = 
MIN( maxRAMLines, 
 
  607               TemplateElementType* newLinePtr = 0;
 
  609               for( 
unsigned int allLinesPtrsVecIdx = 0 ; allLinesPtrsVecIdx <
 
  610                 ramLinesIndexesVecSize ; ++allLinesPtrsVecIdx )
 
  641       template< 
typename TemplateElementType >
 
  644         TemplateElementType* linePtr = 0;
 
  645         for( 
unsigned int memoryblocksHandlerIdx = 0 ; memoryblocksHandlerIdx <
 
  652             delete[] ( linePtr );
 
  670       template< 
typename TemplateElementType >
 
  677       template< 
typename TemplateElementType >
 
  684       template< 
typename TemplateElementType >
 
  690       template< 
typename TemplateElementType >
 
  697           "Unable to initiate the matrix object" );
 
  699         unsigned int column = 0;;
 
  700         TemplateElementType 
const* inLinePtr = 0;
 
  701         TemplateElementType* outLinePtr = 0;
 
  703         for( 
unsigned int line = 0 ; line < 
m_totalLines ; ++line ) 
 
  709             outLinePtr[ column ] = inLinePtr[ column ];
 
  716       template< 
typename TemplateElementType >
 
  722       template< 
typename TemplateElementType >
 
  728       template< 
typename TemplateElementType >
 
  734       template< 
typename TemplateElementType >
 
  737         const unsigned long int diskLinesNmb = 
m_totalLines - startingLineIdx;
 
  741           const unsigned long int lineSizeBytes = (
unsigned long int)(
 
  744           const unsigned long int maxLinesPerFile = ( 
unsigned long int )
 
  747           const unsigned long int maxFileSize = (
unsigned long int)
 
  748             ( maxLinesPerFile * lineSizeBytes );
 
  750           const unsigned int openDiskFilesNumber = (
unsigned int)ceil( ((
double)diskLinesNmb) 
 
  751             / ((
double)maxLinesPerFile) );
 
  757           unsigned int remainingLinesNmb = diskLinesNmb;
 
  758           unsigned int fileSize = 0;
 
  759           unsigned int fileLinesNumber = 0;    
 
  760           unsigned int diskLinesVecIdx = startingLineIdx;
 
  762           for( 
unsigned int fileIdx = 0 ; fileIdx < openDiskFilesNumber ; 
 
  767             fileSize = maxFileSize;
 
  768             fileLinesNumber = maxLinesPerFile;
 
  770             if( remainingLinesNmb < maxLinesPerFile )
 
  772               fileSize = (
unsigned long int)( lineSizeBytes * remainingLinesNmb );
 
  773               fileLinesNumber = remainingLinesNmb;
 
  776             remainingLinesNmb -= fileLinesNumber;
 
  780             FILE* newFilePtr = 0;
 
  781             std::string newFullFileName;
 
  785               TERP_LOGERR( 
"Unable to create temporary disk file" );
 
  794               for( 
unsigned int lineIdx = 0; lineIdx < fileLinesNumber ; ++lineIdx )
 
  809       template< 
typename TemplateElementType >
 
  840             (
long)( inLineData.m_fileOff ), SEEK_SET ),
 
  845             (
size_t)( 
sizeof( TemplateElementType ) * 
m_totalColumns ), 1, inLineData.m_filePtr ),
 
  851             (
long)( inLineData.m_fileOff ), SEEK_SET ),
 
  858             (
size_t)( 
sizeof( TemplateElementType ) * m_totalColumns ), 1, 
 
  859             inLineData.m_filePtr ), 
"File write error" )        
 
  873           outLineData.m_filePtr = inLineData.m_filePtr;
 
  874           outLineData.m_fileOff = inLineData.m_fileOff;
 
  876           inLineData.m_filePtr = 0;
 
  877           inLineData.m_fileOff = 0;    
 
  890       template< 
typename TemplateElementType >
 
  892         FILE** fileptr, std::string& fullFileName )
 const 
  894         fullFileName = boost::filesystem::unique_path( 
 
  895           boost::filesystem::temp_directory_path() /= 
 
  896           boost::filesystem::path( 
"TerralibRPMatrix_%%%%-%%%%-%%%%-%%%%" ) ).string();
 
  897         if( fullFileName.empty() )
 
  902         (*fileptr) = fopen( fullFileName.c_str(), 
"wb+" );
 
  905         long seekoff = (long)( size - 1 );
 
  907         if( 0 != fseek( (*fileptr), seekoff, SEEK_SET ) )
 
  909           fclose( (*fileptr) );
 
  910           remove( fullFileName.c_str() );
 
  915         unsigned char c = 
'\0';
 
  916         if( 1 != fwrite( &c, 1, 1, (*fileptr) ) )
 
  918           fclose( (*fileptr) );
 
  919           remove( fullFileName.c_str() );
 
  928 #endif //__TERRALIB_RP_INTERNAL_MATRIX_H 
void clear()
Clear all allocated resources and go back to the initial default parameters. 
 
unsigned int m_fileOff
The offset within the file. 
 
TECOMMONEXPORT unsigned long int GetTotalPhysicalMemory()
Returns the amount of total physical memory (bytes). 
 
FILE * m_filePtr
The file pointer. 
 
unsigned char m_maxMemPercentUsage
the max amount of free memory to use when necessary. 
 
TECOMMONEXPORT unsigned long int GetUsedVirtualMemory()
Returns the amount of used virtual memory (bytes) for the current process (physical + swapped)...
 
unsigned char getMaxMemPercentUsage() const 
Returns the max amount of free memory to use when necessary. 
 
std::vector< DiskLineInfo > m_diskLinesInfoVec
Info of all lines, used when a line is on disk. 
 
#define MIN(a, b)
Macro that returns min between two values. 
 
#define TERP_LOGERR(message)
Logs an error message. 
 
const TemplateElementType & operator()(const unsigned int &line, const unsigned int &column) const 
Operator () overload. 
 
TemplateElementType & operator()(const unsigned int &line, const unsigned int &column)
Operator () overload. 
 
bool allocateDiskLines(unsigned int startingLineIdx)
Allocate disk lines. 
 
#define MAX(a, b)
Macro that returns max between two values. 
 
void init()
Reset the internal variables to the initial state. 
 
MemoryPolicy m_memoryPolicy
The used memory policy (default:RAMMemPol). 
 
MemoryPolicy getMemPolicy() const 
Returns the current memory policy. 
 
#define TERP_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged and a return of context wi...
 
unsigned long int m_maxTmpFileSize
Max bytes per temp file (for swapped tiles only, default: 2GB). 
 
std::vector< unsigned int > m_ramLinesIndexesVec
The indexes of all lines loaded into RAM. 
 
MemoryPolicy
Memory polycy. 
 
std::vector< TemplateElementType * > m_allLinesPtrsVec
A vector with pointers to all lines. 
 
unsigned int getColumnsNumber() const 
The number of current matrix columns. 
 
Openend disk files info node. 
 
unsigned int m_totalColumns
The total columns number (default:0). 
 
const Matrix< TemplateElementType > & operator=(const Matrix< TemplateElementType > &external)
Operator = overload. 
 
unsigned long int getMaxTmpFileSize() const 
Returns the current maximum temporary disk file size. 
 
std::vector< OpenDiskFileHandler > m_openDiskFilesHandler
A vector with open disk files handler. 
 
void reset()
Reset (clear) the active instance data. 
 
TECOMMONEXPORT unsigned long int GetTotalVirtualMemory()
Returns the amount of total virtual memory (bytes) that can be claimed by the current process (physic...
 
TemplateElementType * getScanLine(const unsigned int &line) const 
Returns a pointer to the required line. 
 
#define TERP_LOG_AND_RETURN_FALSE(message)
Logs a warning message will and return false. 
 
TemplateElementType const * operator[](const unsigned int &line) const 
Operator [] overload. 
 
std::vector< TemplateElementType * > m_memoryblocksHandler
 
A generic template matrix. 
 
TemplateElementType ElementTypeT
Public matrix element type definition. 
 
FILE * m_filePtr
The file pointer. 
 
TemplateElementType * m_currentSwapTilePtr
A pointer to the current swap tile. 
 
unsigned int m_nextSwapLineRamLinesIndexesVecIdx
The index inside ramLinesIndexesVec_ of the next RAM line index that will be swapped to disk when a d...
 
bool createNewDiskFile(unsigned long int size, FILE **fileptr, std::string &fullFileName) const 
Create a new disk file. 
 
#define TERP_DEBUG_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not. 
 
std::string m_fullFileName
The full created file name. 
 
bool isEmpty() const 
Empty Matrix verification. 
 
unsigned int m_totalLines
The total lines number (default:0). 
 
unsigned int getLinesNumber() const 
The number of current matrix lines. 
 
TemplateElementType * operator[](const unsigned int &line)
Operator [] overload. 
 
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not. 
 
boost::scoped_array< TemplateElementType > m_swapMemoryBlockHandler
An auxiliar line used when swapping data to/from disk.