34 #ifndef CARTODATA_VOLUME_VOLUMEBASE_D_INLINE_H 35 #define CARTODATA_VOLUME_VOLUMEBASE_D_INLINE_H 46 template <
typename T >
50 #ifdef CARTO_USE_BLITZ 57 return _blitz( blitz::TinyVector<long,4>( x, y, z, t ) );
59 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& bstrides
61 return _items[ x * bstrides[0] + y * bstrides[1] + z * bstrides[2]
65 return _items[ x + y * _lineoffset + z * _sliceoffset
66 + t * _volumeoffset ];
71 template <
typename T >
75 return at( x, y, z, t );
79 template <
typename T >
83 #ifdef CARTO_USE_BLITZ 90 return _blitz( blitz::TinyVector<long,4>( x, y, z, t ) );
92 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& bstrides
108 return _items[ x * bstrides[0] + y * bstrides[1] + z * bstrides[2]
112 return _items[ x + y * _lineoffset + z * _sliceoffset
113 + t * _volumeoffset ];
118 template <
typename T >
122 return at( x, y, z, t );
126 template <
typename T >
130 return at( pos[0], pos[1], pos[2], pos[3] );
134 template <
typename T >
142 template <
typename T >
146 return at( pos[0], pos[1], pos[2], pos[3] );
150 template <
typename T >
158 template <
typename T >
inline 161 #ifdef CARTO_USE_BLITZ 173 # if !defined( __clang__ ) && __GNUC__-0 < 5 184 switch( index.size() )
188 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
191 return _blitz.dataZero()[ index[0] * strides[0] ];
195 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
198 return _blitz.dataZero()[ index[0] * strides[0]
199 + index[1] * strides[1] ];
203 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
206 return _blitz.dataZero()[ index[0]
207 + index[1] * strides[1]
208 + index[2] * strides[2] ];
212 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
215 return _blitz.dataZero()[ index[0] * strides[0]
216 + index[1] * strides[1]
217 + index[2] * strides[2]
218 + index[3] * strides[3] ];
222 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
225 return _blitz.dataZero()[ index[0] * strides[0]
226 + index[1] * strides[1]
227 + index[2] * strides[2]
228 + index[3] * strides[3]
229 + index[4] * strides[4] ];
233 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
236 return _blitz.dataZero()[ index[0] * strides[0]
237 + index[1] * strides[1]
238 + index[2] * strides[2]
239 + index[3] * strides[3]
240 + index[4] * strides[4]
241 + index[5] * strides[5] ];
245 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
248 return _blitz.dataZero()[ index[0] * strides[0]
249 + index[1] * strides[1]
250 + index[2] * strides[2]
251 + index[3] * strides[3]
252 + index[4] * strides[4]
253 + index[5] * strides[5]
254 + index[6] * strides[6] ];
258 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
261 return _blitz.dataZero()[ index[0] * strides[0]
262 + index[1] * strides[1]
263 + index[2] * strides[2]
264 + index[3] * strides[3]
265 + index[4] * strides[4]
266 + index[5] * strides[5]
267 + index[6] * strides[6]
268 + index[7] * strides[7] ];
276 blitz::TinyVector<int, Volume<T>::DIM_MAX> pos;
277 int i, n = index.size();
278 for( i=0; i<n && i<Volume<T>::DIM_MAX; ++i )
280 for( ; i<Volume<T>::DIM_MAX; ++i )
282 return _blitz( pos );
293 return *_blitz.dataZero();
301 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
305 for(
int i=0; i!=index.size(); ++i )
306 offset += index[i] * strides[i];
307 return _blitz.dataZero()[ offset ];
310 if( index.size() >= 4 )
311 return at( index[0], index[1], index[2], index[3] );
312 else if( index.size() >= 3 )
313 return at( index[0], index[1], index[2] );
314 else if( index.size() >= 2 )
315 return at( index[0], index[1] );
317 return at( index[0] );
321 template <
typename T >
inline 324 #ifdef CARTO_USE_BLITZ 336 # if !defined( __clang__ ) && __GNUC__-0 < 5 347 switch( index.size() )
351 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
354 return _blitz.dataZero()[ index[0] * strides[0] ];
358 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
361 return _blitz.dataZero()[ index[0] * strides[0]
362 + index[1] * strides[1] ];
366 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
369 return _blitz.dataZero()[ index[0]
370 + index[1] * strides[1]
371 + index[2] * strides[2] ];
375 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
378 return _blitz.dataZero()[ index[0] * strides[0]
379 + index[1] * strides[1]
380 + index[2] * strides[2]
381 + index[3] * strides[3] ];
385 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
388 return _blitz.dataZero()[ index[0] * strides[0]
389 + index[1] * strides[1]
390 + index[2] * strides[2]
391 + index[3] * strides[3]
392 + index[4] * strides[4] ];
396 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
399 return _blitz.dataZero()[ index[0] * strides[0]
400 + index[1] * strides[1]
401 + index[2] * strides[2]
402 + index[3] * strides[3]
403 + index[4] * strides[4]
404 + index[5] * strides[5] ];
408 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
411 return _blitz.dataZero()[ index[0] * strides[0]
412 + index[1] * strides[1]
413 + index[2] * strides[2]
414 + index[3] * strides[3]
415 + index[4] * strides[4]
416 + index[5] * strides[5]
417 + index[6] * strides[6] ];
421 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
424 return _blitz.dataZero()[ index[0] * strides[0]
425 + index[1] * strides[1]
426 + index[2] * strides[2]
427 + index[3] * strides[3]
428 + index[4] * strides[4]
429 + index[5] * strides[5]
430 + index[6] * strides[6]
431 + index[7] * strides[7] ];
439 blitz::TinyVector<int, Volume<T>::DIM_MAX> pos;
440 int i, n = index.size();
441 for( i=0; i<n && i<Volume<T>::DIM_MAX; ++i )
443 for( ; i<Volume<T>::DIM_MAX; ++i )
445 return _blitz( pos );
456 return *_blitz.dataZero();
463 const blitz::TinyVector<BlitzStridesType, Volume<T>::DIM_MAX>& strides
467 for(
int i=0; i!=index.size(); ++i )
468 offset += index[i] * strides[i];
469 return _blitz.dataZero()[ offset ];
472 if( index.size() >= 4 )
473 return at( index[0], index[1], index[2], index[3] );
474 else if( index.size() >= 3 )
475 return at( index[0], index[1], index[2] );
476 else if( index.size() >= 2 )
477 return at( index[0], index[1] );
479 return at( index[0] );
483 template <
typename T >
inline 486 return at( position );
490 template <
typename T >
inline 493 return at( position );
496 #ifdef CARTO_USE_BLITZ 497 template <
typename T >
inline 500 return _blitz( index );
503 template <
typename T >
inline 506 return _blitz( index );
509 template <
typename T >
inline 512 return _blitz( index );
515 template <
typename T >
inline 518 return _blitz( index );
521 template <
typename T >
inline 524 return _blitz( index );
527 template <
typename T >
inline 530 return _blitz( index );
533 template <
typename T >
inline 536 return _blitz( index );
539 template <
typename T >
inline 542 return _blitz( index );
545 template <
typename T >
inline 548 return _blitz( index );
551 template <
typename T >
inline 554 return _blitz( index );
557 template <
typename T >
inline 558 blitz::Array<T,Volume< T >::DIM_MAX>
561 return _blitz( subdomain );
564 template <
typename T >
inline 565 blitz::Array<T,Volume< T >::DIM_MAX>
568 return _blitz( subdomain );
571 template <
typename T >
inline 572 blitz::Array<T,Volume< T >::DIM_MAX>
578 template <
typename T >
inline 579 blitz::Array<T,Volume< T >::DIM_MAX>
582 return _blitz( r0, r1 );
585 template <
typename T >
inline 586 blitz::Array<T,Volume< T >::DIM_MAX>
588 const blitz::Range & r2 )
const 590 return _blitz( r0, r1, r2 );
593 template <
typename T >
inline 594 blitz::Array<T,Volume< T >::DIM_MAX>
596 const blitz::Range & r2,
const blitz::Range & r3 )
const 598 return _blitz( r0, r1, r2, r3 );
601 template <
typename T >
604 long x6,
long x7,
long x8 )
const 606 return _blitz( blitz::TinyVector<long,8>( x1, x2, x3, x4, x5, x6, x7,
610 template <
typename T >
613 long x5,
long x6,
long x7,
long x8 )
const 615 return at( x1, x2, x3, x4, x5, x6, x7, x8 );
618 template <
typename T >
621 long x5,
long x6,
long x7,
long x8 )
623 return _blitz( blitz::TinyVector<long,8>( x1, x2, x3, x4, x5, x6, x7,
628 template <
typename T >
631 long x5,
long x6,
long x7,
long x8 )
633 return at( x1, x2, x3, x4, x5, x6, x7, x8 );
638 template <
typename T>
644 template <
typename T>
650 return volumeout << volume;
653 template <
typename T>
659 std::vector<int> dims = volume.
getSize();
660 for(
int d=0, n=dims.size(); d<n; ++d )
669 std::string tB = ( hasT ?
"[" :
"" );
670 std::string tE = ( hasT ?
"]" :
"" );
671 std::string tS = ( hasT ?
" " :
"" );
673 std::string zB = ( hasZ ?
"[" :
"" );
674 std::string zE = ( hasZ ?
"]" :
"" );
675 std::string zS = ( hasZ ?
" " :
"" );
677 std::string yB = ( hasY ?
"[" :
"" );
678 std::string yE = ( hasY ?
"]" :
"" );
679 std::string yS = ( hasY ?
" " :
"" );
681 std::string xB = ( hasX ?
"[" :
"" );
682 std::string xE = ( hasX ?
"]" :
"" );
683 std::string xS = ( hasX ?
" " :
"" );
685 size_t sizeT =
static_cast<size_t>(volume.
getSizeT());
686 size_t sizeZ =
static_cast<size_t>(volume.
getSizeZ());
687 size_t sizeY =
static_cast<size_t>(volume.
getSizeY());
688 size_t sizeX =
static_cast<size_t>(volume.
getSizeX());
690 for(
size_t t = 0; t < sizeT; ++t )
693 if( t < out.
maxT() ) {
694 out.
ostream() << std::setw(2) << std::left << tB;
696 out.
ostream() << std::setw(3) << std::left <<
"...";
700 for(
size_t z = 0; z < sizeZ; ++z )
703 if( z < out.
maxZ() ) {
704 out.
ostream() << std::setw(2) << std::left << zB;
706 out.
ostream() << std::setw(3) << std::left <<
"...";
710 for(
size_t y = 0; y < sizeY; ++y )
712 if( y < out.
maxY() ) {
713 out.
ostream() << std::setw(2) << std::left << yB;
715 out.
ostream() << std::setw(3) << std::left <<
"...";
718 for(
size_t x = 0; x < sizeX; ++x )
720 if( x < out.
maxX() ) {
721 out.
ostream() << std::setw(10) << std::left
722 <<
toString( volume( x, y, z, t ) );
724 out.
ostream() << std::setw(10) << std::left <<
"...";
728 out.
ostream() << std::setw(2) << std::left << yE;
732 out.
ostream() << std::setw(2) << std::left << zS;
734 out.
ostream() << std::setw(2) << std::left << tS;
737 out.
ostream() << std::setw(2) << std::left << zE;
741 out.
ostream() << std::setw(2) << std::left << tS;
744 out.
ostream() << std::setw(2) << std::left << tE;
752 template <
typename T>
760 << (v->allocatorContext().isAllocated() ?
"" :
"not ")
761 <<
"allocated" << std::endl << std::flush;
764 std::vector<int> dims = v->getSize();
768 for(
int i=0; i<dims.size()-1; ++i)
769 std::cout << dims[i] <<
", ";
770 std::cout << dims[dims.size()-1] <<
"]" << std::endl << std::flush;
774 std::vector<int> borders = v->getBorders();
777 if (borders.size()>0) {
778 for(
int i=0; i<borders.size()-1; ++i)
779 std::cout << borders[i] <<
", ";
780 std::cout << borders[borders.size()-1] <<
"]" << std::endl << std::flush;
785 if (v->refVolume().
isNull()) {
786 std::vector<int> pos = v->posInRefVolume();
788 <<
" position in parent [";
789 for(
int i=0; i<pos.size()-1; ++i)
790 std::cout << pos[i] <<
", ";
791 std::cout << pos[pos.size()-1] <<
"]" << std::endl << std::flush;
801 #endif // CARTODATA_VOLUME_VOLUMEBASE_D_INLINE_H
const size_t & maxY() const
const T & at(long x, long y=0, long z=0, long t=0) const
const size_t & maxX() const
const size_t & maxT() const
std::ostream & ostream() const
static Object reference(T &value)
std::ostream & operator<<(std::ostream &out, const VoxelValue< T, C > &aa)
std::vector< int > getSize() const
get the 4 dimensions in a vector
carto::Object getObjectHeader(Headered &h)
void displayRefVolumes(const Volume< T > &vol)
Display information about volumes hierarchy.
const T & operator()(long x, long y=0, long z=0, long t=0) const
Warning: this operator is not virtual, so may not have the expected result on inherited classes (see ...
std::string toString(const T &object)
const size_t & maxZ() const
std::vector< int > Position