47 for(
unsigned int i=0; i<v->size() ;i++){
48 s <<
"[" << (*v)[i] <<
"]";
54 NDimensionalArray::NDimensionalArray()
55 :_dapType(dods_null_c),_shape(0),_currentLastDimensionSlabIndex(0),_totalValueCount(0),_sizeOfValue(0),_storage(0) {
57 string msg =
"NDimArray::NDimArray() - INTERNAL_ERROR: This is the private constructor and should never be used";
58 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
59 throw libdap::InternalErr(__FILE__, __LINE__, msg);
63 NDimensionalArray::NDimensionalArray(libdap::Array *a)
64 :_dapType(dods_null_c),_shape(0),_currentLastDimensionSlabIndex(0),_totalValueCount(0),_sizeOfValue(0),_storage(0) {
65 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray(libdap::Array *) - BEGIN"<< endl);
67 _shape =
new vector<unsigned int>(a->dimensions(
true), (
unsigned int)1);
69 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray() - _shape" <<
vectorToIndices(_shape) << endl);
70 _dapType = a->var()->type();
71 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray() - Total Value Count: " << _totalValueCount <<
" element(s) of type '"<< libdap::type_name(_dapType) <<
"'" << endl);
73 allocateStorage(_totalValueCount, _dapType);
74 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray(libdap::Array *) - END"<< endl);
78 NDimensionalArray::NDimensionalArray(std::vector<unsigned int> *shape, libdap::Type dapType)
79 :_dapType(dods_null_c),_shape(0),_currentLastDimensionSlabIndex(0),_totalValueCount(0),_sizeOfValue(0),_storage(0) {
80 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray(std::vector<unsigned int> *, libdap::Type) - BEGIN"<< endl);
82 _shape =
new vector<unsigned int>(*shape);
85 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray() - _shape" <<
vectorToIndices(_shape) << endl);
86 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray() - Total Value Count: " << _totalValueCount <<
" element(s) of type '"<< libdap::type_name(_dapType) <<
"'" << endl);
87 allocateStorage(_totalValueCount, _dapType);
88 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::NDimensionalArray(std::vector<unsigned int> *, libdap::Type) - END"<< endl);
94 delete [] (
char *) _storage;
118 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - BEGIN." << endl);
120 libdap::Array::Dim_iter dIt;
125 unsigned int dimSize = 1;
129 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - Array has " << a->dimensions(
true) <<
" dimensions."<< endl);
133 for(dIt = a->dim_begin() ; dIt!=a->dim_end() ;dIt++){
134 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - Processing dimension '" << a->dimension_name(dIt)<<
"'. (dim# "<< dimNum <<
")"<< endl);
135 start = a->dimension_start(dIt,
true);
136 stride = a->dimension_stride(dIt,
true);
137 stop = a->dimension_stop(dIt,
true);
138 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - start: " << start <<
" stride: " << stride <<
" stop: "<<stop<< endl);
140 dimSize = 1 + ( (stop - start) / stride);
141 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - dimSize: " << dimSize << endl);
143 (*shape)[dimNum++] = dimSize;
144 totalSize *= dimSize;
146 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - totalSize: " << totalSize << endl);
147 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::computeConstrainedShape() - END." << endl);
153 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - BEGIN." << endl);
156 libdap::Array::Dim_iter dIt;
157 libdap::Array::Dim_iter next_dIt;
164 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - Array has " << a->dimensions(
true) <<
" dimensions."<< endl);
168 for(dIt =a->dim_begin() ; dIt!=a->dim_end() ;dIt++){
172 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - Processing dimension '" << a->dimension_name(dIt)<<
"'. (dim# "<< dimNum <<
")"<< endl);
173 start = a->dimension_start(dIt,
true);
174 stride = a->dimension_stride(dIt,
true);
175 stop = a->dimension_stop(dIt,
true);
176 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - start: " << start <<
" stride: " << stride <<
" stop: "<<stop<< endl);
178 if(next_dIt!=a->dim_end() && start!=stop && stride!=1){
179 msg <<
"retrieveLastDimHyperSlabLocationFromConstrainedArrray() - The array '" << a->name() <<
"' has not been constrained to a last dimension hyperslab.";
180 BESDEBUG(NDimensionalArray_debug_key, msg.str() << endl);
181 throw Error(msg.str());
184 if(next_dIt==a->dim_end()){
185 if( start!=0 || stride!=1 || stop!=((
unsigned int)a->dimension_size(dIt)-1)){
186 msg <<
"retrieveLastDimHyperSlabLocationFromConstrainedArrray() - The array '" << a->name() <<
"' has not been constrained to a last dimension hyperslab.";
187 BESDEBUG(NDimensionalArray_debug_key, msg.str() << endl);
188 throw Error(msg.str());
192 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - location"<<
vectorToIndices(location) << endl);
193 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - END." << endl);
197 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::retrieveLastDimHyperSlabLocationFromConstrainedArrray() - Adding location "<< start <<
" to dimension " << location->size() << endl);
200 location->push_back(start);
204 msg <<
"retrieveLastDimHyperSlabLocationFromConstrainedArrray() - Method Failure - this line should never be reached.";
205 BESDEBUG(NDimensionalArray_debug_key, msg.str() << endl);
206 throw Error(msg.str());
221 for(
unsigned int i=0; i<shape->size(); i++){
222 totalSize *= (*shape)[i];
232 void NDimensionalArray::allocateStorage(
long numValues, Type dapType){
234 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::allocateStorage() - Allocating memory for " << numValues <<
" element(s) of type '"<< libdap::type_name(dapType) <<
"'" << endl);
238 _sizeOfValue =
sizeof(dods_byte);
241 _sizeOfValue =
sizeof(dods_int16);
244 _sizeOfValue =
sizeof(dods_uint16);
247 _sizeOfValue =
sizeof(dods_int32);
250 _sizeOfValue =
sizeof(dods_uint32);
253 _sizeOfValue =
sizeof(dods_float32);
256 _sizeOfValue =
sizeof(dods_float64);
259 throw InternalErr(__FILE__, __LINE__,
260 "Unknown DAP type encountered when constructing NDimensionalArray");
263 _storage =
new char[numValues * _sizeOfValue];
270 void NDimensionalArray::confirmStorage(){
272 string msg =
"ERROR - NDimensionalArray storage has been relinquished. Instance is no longer viable for set/get operations.";
273 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
274 throw InternalErr(__FILE__, __LINE__, msg);
282 void NDimensionalArray::confirmType(Type dapType){
283 if(_dapType != dapType){
284 string msg =
"NDimensionalArray::setValue() - Passed value does not match template array type. Expected "
285 + libdap::type_name(_dapType) +
" received "+ libdap::type_name(dapType);
286 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
287 throw InternalErr(__FILE__, __LINE__, msg);
295 void NDimensionalArray::confirmLastDimSize(
unsigned int n){
297 if(elementCount != n){
298 string msg =
"NDimensionalArray::setLastDimensionHyperSlab() - Passed valueCount does not match size of last dimension hyper-slab. ";
299 msg +=
"Last dimension hyper-slab has " + libdap::long_to_string(elementCount) +
" elements. ";
300 msg +=
"Received a valueCount of "+ libdap::long_to_string(n);
301 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
302 throw InternalErr(__FILE__, __LINE__, msg);
318 confirmType(dods_byte_c);
321 dods_byte *_store =
static_cast<dods_byte*
>(_storage);
322 dods_byte oldValue = _store[storageIndex];
323 _store[storageIndex] = value;
335 confirmType(dods_int16_c);
338 dods_int16 *_store =
static_cast<dods_int16 *
>(_storage);
339 dods_int16 oldValue = _store[storageIndex];
340 _store[storageIndex] = value;
351 confirmType(dods_uint16_c);
354 dods_uint16 *_store =
static_cast<dods_uint16 *
>(_storage);
355 dods_uint16 oldValue = _store[storageIndex];
356 _store[storageIndex] = value;
367 confirmType(dods_int32_c);
370 dods_int32 *_store =
static_cast<dods_int32 *
>(_storage);
371 dods_int32 oldValue = _store[storageIndex];
372 _store[storageIndex] = value;
383 confirmType(dods_uint32_c);
386 dods_uint32 *_store =
static_cast<dods_uint32 *
>(_storage);
387 dods_uint32 oldValue = _store[storageIndex];
388 _store[storageIndex] = value;
399 confirmType(dods_float32_c);
402 dods_float32 *_store =
static_cast<dods_float32 *
>(_storage);
403 dods_float32 oldValue = _store[storageIndex];
404 _store[storageIndex] = value;
415 confirmType(dods_float64_c);
418 dods_float64 *_store =
static_cast<dods_float64 *
>(_storage);
419 dods_float64 oldValue = _store[storageIndex];
420 _store[storageIndex] = value;
431 BESDEBUG(NDimensionalArray_debug_key, endl<< endl <<
"NDimensionalArray::getLastDimensionHyperSlab() - BEGIN"<<endl);
433 if(location->size()!=_shape->size()-1){
434 string msg =
"NDimensionalArray::getLastDimensionHyperSlab() - Passed location vector doesn't match array shape.";
435 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
436 throw InternalErr(__FILE__, __LINE__, msg);
440 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getLastDimensionHyperSlab() - location" <<
vectorToIndices(location) << endl);
443 vector<unsigned int> slabLocation(*location);
446 slabLocation.push_back(0);
447 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getLastDimensionHyperSlab() - slabLocation" <<
vectorToIndices(&slabLocation) << endl);
451 *slab = &((
char *)_storage)[storageIndex*_sizeOfValue];
452 *elementCount = *(_shape->rbegin());
453 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getLastDimensionHyperSlab() - END"<<endl<<endl);
459 unsigned int storageIndex = _shape->back() * _currentLastDimensionSlabIndex++;
460 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getNextLastDimensionHyperSlab() - Storage Index:"<< libdap::long_to_string(storageIndex) << endl);
461 *slab = &((
char *)_storage)[storageIndex*_sizeOfValue];
470 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getStorageIndex() - BEGIN." << endl);
471 long storageIndex = 0;
474 if(location->size() != shape->size()){
475 string msg =
"getStorageIndex() - The supplied location vector does not match array shape.";
476 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
480 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getStorageIndex() - Shape and location have the same number of elements." << endl);
485 for(dimIndex = shape->size()-1 ; dimIndex >=0 ; dimIndex--){
486 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getStorageIndex() - dimIndex=" << libdap::long_to_string(dimIndex) << endl);
488 if((*location)[dimIndex] >= (*shape)[dimIndex]){
489 string msg =
"NDimensionalArray::getStorageIndex() - The location vector references a value that does not match the array shape. ";
490 msg +=
"location[" + libdap::long_to_string(dimIndex) +
"]=";
491 msg += libdap::long_to_string((*location)[dimIndex]) +
" ";
492 msg +=
"shape[" + libdap::long_to_string(dimIndex) +
"]=";
493 msg += libdap::long_to_string((*shape)[dimIndex]) +
" ";
494 BESDEBUG(NDimensionalArray_debug_key, msg << endl);
497 storageIndex += chunkSize * ((*location)[dimIndex]);
498 chunkSize *= ((*shape)[dimIndex]);
501 BESDEBUG(NDimensionalArray_debug_key,
"NDimensionalArray::getStorageIndex() - END." << endl);
512 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_byte *values,
unsigned int valueCount){
513 confirmType(dods_byte_c);
514 confirmLastDimSize(valueCount);
515 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_byte));
524 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_int16 *values,
unsigned int valueCount){
525 confirmType(dods_int16_c);
526 confirmLastDimSize(valueCount);
527 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_int16));
536 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_uint16 *values,
unsigned int valueCount){
537 confirmType(dods_uint16_c);
538 confirmLastDimSize(valueCount);
539 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_uint16));
548 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_int32 *values,
unsigned int valueCount){
549 confirmType(dods_int32_c);
550 confirmLastDimSize(valueCount);
551 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_int32));
560 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_uint32 *values,
unsigned int valueCount){
561 confirmType(dods_uint32_c);
562 confirmLastDimSize(valueCount);
563 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_uint32));
572 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_float32 *values,
unsigned int valueCount){
573 confirmType(dods_float32_c);
574 confirmLastDimSize(valueCount);
575 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_float32));
583 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location, dods_float64 *values,
unsigned int valueCount){
584 confirmType(dods_float64_c);
585 confirmLastDimSize(valueCount);
586 setLastDimensionHyperSlab(location, (
void *) values, valueCount*
sizeof(dods_float64));
595 void NDimensionalArray::setLastDimensionHyperSlab(std::vector<unsigned int> *location,
void *values,
unsigned int byteCount){
598 unsigned int slabElementCount;
601 memcpy ( slab, values, byteCount );
610 memset(_storage,val,_totalValueCount*_sizeOfValue);
618 return *(_shape->rbegin());
623 if(_shape->size() != templateArray->dimensions(
true))
624 throw Error(
"Template Array has different number of dimensions than NDimensional Array!!");
626 libdap::Array *resultDapArray;
631 libdap::Byte tt(templateArray->name());
632 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
637 libdap::Int16 tt(templateArray->name());
638 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
643 libdap::UInt16 tt(templateArray->name());
644 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
649 libdap::Int32 tt(templateArray->name());
650 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
655 libdap::UInt32 tt(templateArray->name());
656 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
661 libdap::Float32 tt(templateArray->name());
662 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
667 libdap::Float64 tt(templateArray->name());
668 resultDapArray =
new libdap::Array(templateArray->name(), &tt);
672 throw InternalErr(__FILE__, __LINE__,
673 "Unknown DAP type encountered when converting to gridfields internal type.");
677 libdap::Array::Dim_iter dimIt;
679 for(dimIt=templateArray->dim_begin(); dimIt!=templateArray->dim_end() ; dimIt++, s++){
680 resultDapArray->append_dim((*_shape)[s], (*dimIt).name);
684 BESDEBUG(NDimensionalArray_debug_key,
"TwoDMeshTopology::getGFAttributeAsDapArray() - Copying libdap::Attribute's from template array " << templateArray->name() << endl);
685 resultDapArray->set_attr_table(templateArray->get_attr_table());
691 resultDapArray->set_value((dods_byte *)_storage,_totalValueCount);
696 resultDapArray->set_value((dods_uint16 *)_storage,_totalValueCount);
701 resultDapArray->set_value((dods_int16 *)_storage,_totalValueCount);
706 resultDapArray->set_value((dods_uint32 *)_storage,_totalValueCount);
711 resultDapArray->set_value((dods_int32 *)_storage,_totalValueCount);
716 resultDapArray->set_value((dods_float32 *)_storage,_totalValueCount);
721 resultDapArray->set_value((dods_float64 *)_storage,_totalValueCount);
725 throw InternalErr(__FILE__, __LINE__,
726 "Unknown DAP type encountered when converting to gridfields internal type.");
730 return resultDapArray;
734 string NDimensionalArray::toString_worker(vector<unsigned int> *location) {
737 if(location->size() == _shape->size()){
746 s << ((dods_byte *)_storage)[storageIndex];
751 s << ((dods_uint16 *)_storage)[storageIndex];
756 s << ((dods_int16 *)_storage)[storageIndex];
761 s << ((dods_uint32 *)_storage)[storageIndex];
766 s << ((dods_int32 *)_storage)[storageIndex];
771 s << ((dods_float32 *)_storage)[storageIndex];
776 s << ((dods_float64 *)_storage)[storageIndex];
780 throw InternalErr(__FILE__, __LINE__,
781 "Unknown DAP type encountered when converting to gridfields internal type.");
788 int nextDimSize = (*_shape)[location->size()];
789 for(
int i=0; i<nextDimSize ;i++){
790 location->push_back(i);
791 s << toString_worker(location);
792 location->pop_back();
804 vector<unsigned int> location;
806 s << endl <<
"NDimensionalArray: " << endl;
807 s << toString_worker(&location);
libdap::Array * getArray(libdap::Array *templateArray)
void * relinquishStorage()
Returns a pointer to the underlying storage for the NDimensionalArray.
static long computeArraySizeFromShapeVector(vector< unsigned int > *shape)
Computes the total number of elements of the n-dimensional array described by the shape vector...
static class NCMLUtil overview
static void retrieveLastDimHyperSlabLocationFromConstrainedArrray(libdap::Array *a, vector< unsigned int > *location)
long getLastDimensionElementCount()
Returns the size, in elements, of the last dimension.
void setAll(char val)
Uses 'memset' to set ALL of the values in the NDimensionalArray to the passed char value...
static long getStorageIndex(vector< unsigned int > *shape, vector< unsigned int > *location)
Computes the element index in the underlying one dimensional array for the passed location based on a...
static string vectorToIndices(vector< unsigned int > *v)
static long computeConstrainedShape(libdap::Array *a, vector< unsigned int > *shape)
Computes and returns (via the returned value parameter 'shape') the constrained shape of the libdap::...
void getNextLastDimensionHyperSlab(void **slab)
dods_byte setValue(std::vector< unsigned int > *location, dods_byte value)
Sets the value of the array at the location specified by the passed location vector.
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream
void getLastDimensionHyperSlab(std::vector< unsigned int > *location, void **slab, unsigned int *elementCount)
The return value parameters slab and elementCount are used to return a pointer to the first element o...
virtual ~NDimensionalArray()