diff --git a/DSArrayManager.h b/DSArrayManager.h new file mode 100644 index 0000000..e215ad0 --- /dev/null +++ b/DSArrayManager.h @@ -0,0 +1,299 @@ +#ifndef _DS_ARRAY_MANAGER +#define _DS_ARRAY_MANAGER + +#include "DSArray.h" +#include + +class DSArrayManager { + private: + + + public: + //list* ds_arrays; + vector 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; +} + +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