the ds_array manager class

This commit is contained in:
Braffolk 2018-08-07 02:14:46 +03:00 committed by GitHub
parent 0643ab22d2
commit 276bfd4a02
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

299
DSArrayManager.h Normal file
View File

@ -0,0 +1,299 @@
#ifndef _DS_ARRAY_MANAGER
#define _DS_ARRAY_MANAGER
#include "DSArray.h"
#include <vector>
class DSArrayManager {
private:
public:
//list<DSArray*>* ds_arrays;
vector<DSArray*> ds_arrays;
DSArray* ds_array_active = nullptr;
int ds_array_active_index = -1;
int array_count = 0;
DSArrayManager();
~DSArrayManager();
DSArray* get_ptr( int index );
int ds_array_create( int d_type, int width, int height );
int ds_array_create_fast( int d_type, int width, int height );
bool ds_array_exists( int index );
bool ds_array_destroy( int index );
int ds_array_copy( int index );
/// Handling
void ds_array_set( int index, int x, int y, double val );
double ds_array_get( int index, int x, int y );
void ds_array_set_region( int index, int x1, int y1, int x2, int y2, double val );
void ds_array_clear( int index, double val );
int ds_array_find_index( int index, double val, int offset );
/// Target handling
void ds_array_target_set( int x, int y, double val );
double ds_array_target_get( int x, int y );
void ds_array_target_set_region( int x1, int y1, int x2, int y2, double val );
void ds_array_target_clear( double val );
int ds_array_target_find_index( double val, int offset );
/// Buffers
int ds_array_poke( int index, char* address_buffer, size_t offset );
int ds_array_peek( int index, char* address_buffer, size_t offset );
int ds_array_poke_compressed( int index, char* address_buffer, size_t offset );
int ds_array_peek_compressed( int index, char* address_buffer, size_t offset );
/// Information & Utility
int ds_array_size( int index );
int ds_array_type( int index );
int ds_array_width( int index );
int ds_array_height( int index );
/// Meta
/*uint ds_array_find_first();
uint ds_array_find_next( uint ds_array );*/
int ds_array_indices();
int ds_array_count();
bool ds_array_set_target( int index );
int ds_array_get_target();
bool ds_array_has_target();
void ds_array_reset_target();
};
inline DSArray * DSArrayManager::get_ptr( int index )
{
if( index >= 0 && index < ( int ) this->ds_arrays.size() ) {
return this->ds_arrays[ index ];
} else {
return nullptr;
}
}
inline DSArrayManager::DSArrayManager()
{
//ds_arrays = new vector<DSArray*>;
}
inline DSArrayManager::~DSArrayManager()
{
for( auto child : ds_arrays ) {
delete child;
}
ds_arrays.clear();
//delete ds_arrays;
}
inline int DSArrayManager::ds_array_create_fast( int d_type, int width, int height )
{
DSArray* ds_array = new DSArray( d_type, width, height );
int index;
ds_arrays.push_back( ds_array );
index = ds_arrays.size() - 1;
this->array_count++;
return index;
}
inline int DSArrayManager::ds_array_create( int d_type, int width, int height )
{
DSArray* ds_array = new DSArray( d_type, width, height );
int index;
auto free_it = std::find( ds_arrays.begin(), ds_arrays.end(), nullptr );
if( free_it != ds_arrays.end() ) {
index = free_it - ds_arrays.begin();
ds_arrays[ index ] = ds_array;
} else {
ds_arrays.push_back( ds_array );
index = ds_arrays.size() - 1;
}
this->array_count++;
return index;
}
inline bool DSArrayManager::ds_array_exists( int index )
{
return ( this->get_ptr( index ) != nullptr );
}
inline bool DSArrayManager::ds_array_destroy( int index )
{
if( this->ds_array_exists( index ) ) {
DSArray* ptr = this->get_ptr( index );
ds_arrays[ index ] = nullptr;
delete ptr;
if( this->ds_array_active == ptr ) {
this->ds_array_active = nullptr;
this->ds_array_active_index = -1;
}
this->array_count--;
return true;
}
return false;
}
inline int DSArrayManager::ds_array_copy( int index )
{
if( this->ds_array_exists( index ) ) {
DSArray* ptr = this->get_ptr( index );
int copy = this->ds_array_create( ptr->type, ptr->width, ptr->height );
DSArray* copy_ptr = this->get_ptr( copy );
ptr->write( ( char* ) copy_ptr->data->get_address(), 0 );
return copy;
}
return -1;
}
/// Handling
inline void DSArrayManager::ds_array_set( int index, int x, int y, double val )
{
this->ds_arrays[ index ]->set( x, y, val );
}
inline double DSArrayManager::ds_array_get( int index, int x, int y )
{
return this->ds_arrays[ index ]->get( x, y );
}
inline void DSArrayManager::ds_array_set_region( int index, int x1, int y1, int x2, int y2, double val )
{
this->ds_arrays[ index ]->set_region( x1, y1, x2, y2, val );
}
inline void DSArrayManager::ds_array_clear( int index, double val )
{
return this->ds_arrays[ index ]->clear( val );
}
inline int DSArrayManager::ds_array_find_index( int index, double val, int offset )
{
return this->ds_arrays[ index ]->find_index( val, offset );
}
/// Targets
inline void DSArrayManager::ds_array_target_set( int x, int y, double val )
{
ds_array_active->set( x, y, val );
}
inline double DSArrayManager::ds_array_target_get( int x, int y )
{
return ds_array_active->get( x, y );
}
inline void DSArrayManager::ds_array_target_set_region( int x1, int y1, int x2, int y2, double val )
{
this->ds_array_active->set_region( x1, y1, x2, y2, val );
}
inline void DSArrayManager::ds_array_target_clear( double val )
{
return this->ds_array_active->clear( val );
}
inline int DSArrayManager::ds_array_target_find_index( double val, int offset )
{
return this->ds_array_active->find_index( val, offset );
}
/// Buffers
inline int DSArrayManager::ds_array_poke( int index, char * address_buffer, size_t offset )
{
return this->ds_arrays[ index ]->write( address_buffer, offset );
}
inline int DSArrayManager::ds_array_peek( int index, char * address_buffer, size_t offset )
{
return this->ds_arrays[ index ]->read( address_buffer, offset );
}
inline int DSArrayManager::ds_array_poke_compressed( int index, char * address_buffer, size_t offset )
{
return this->ds_arrays[ index ]->write_compressed( address_buffer, offset );
}
inline int DSArrayManager::ds_array_peek_compressed( int index, char * address_buffer, size_t offset )
{
return this->ds_arrays[ index ]->read_compressed( address_buffer, offset );
}
/// Information & Utility
inline int DSArrayManager::ds_array_size( int index )
{
return this->ds_arrays[ index ]->data->bytesize();
}
inline int DSArrayManager::ds_array_type( int index )
{
return this->ds_arrays[ index ]->type;
}
inline int DSArrayManager::ds_array_width( int index )
{
return this->ds_arrays[ index ]->width;
}
inline int DSArrayManager::ds_array_height( int index )
{
return this->ds_arrays[ index ]->height;
}
/// Meta
inline int DSArrayManager::ds_array_count()
{
return this->array_count;
}
inline int DSArrayManager::ds_array_indices()
{
return ds_arrays.size();
}
inline bool DSArrayManager::ds_array_set_target( int index )
{
DSArray* ptr = this->get_ptr( index );
if( ptr != nullptr ) {
ds_array_active_index = index;
ds_array_active = ptr;
return true;
}
return false;
}
inline int DSArrayManager::ds_array_get_target()
{
return ds_array_active_index;
}
inline bool DSArrayManager::ds_array_has_target()
{
return( ds_array_active_index != -1);
}
inline void DSArrayManager::ds_array_reset_target()
{
ds_array_active = nullptr;
ds_array_active_index = -1;
}
#endif