74 #ifndef SLIP_HYPER_VOLUME_HPP
75 #define SLIP_HYPER_VOLUME_HPP
95 #include <boost/serialization/access.hpp>
96 #include <boost/serialization/split_member.hpp>
97 #include <boost/serialization/version.hpp>
103 template <
typename T>
106 template <
typename T>
109 template <
typename T>
110 std::ostream& operator<<(std::ostream & out, const slip::HyperVolume<T>& a);
121 bool operator<(const slip::HyperVolume<T>& x,
129 bool operator<=(const slip::HyperVolume<T>& x,
161 template <
typename T>
239 static const std::size_t
DIM = 4;
261 const std::size_t d2,
262 const std::size_t d3,
263 const std::size_t d4);
274 const std::size_t d2,
275 const std::size_t d3,
276 const std::size_t d4,
287 const std::size_t d2,
288 const std::size_t d3,
289 const std::size_t d4,
304 template<
typename InputIterator>
311 matrix_(new slip::
Matrix4d<T>(d1,d2,d3,d4,first,last))
337 void resize(std::size_t d1,
2655 const range & row_range,
const range & col_range);
2685 const range & row_range,
const range & col_range);
2716 const range & row_range,
const range & col_range)
const;
2747 const range & row_range,
const range & col_range)
const;
2778 const range & row_range,
const range & col_range);
2809 const range & row_range,
const range & col_range);
2840 const range & row_range,
const range & col_range)
const;
2871 const range & row_range,
const range & col_range)
const;
2887 friend std::ostream& operator<< <>(std::ostream & out,
const HyperVolume<T>& a);
2925 std::fill_n(this->
begin(),this->
size(),value);
2947 template<
typename InputIterator>
3077 std::string
name()
const;
3238 template<
class Archive>
3239 void save(Archive & ar,
const unsigned int version)
const
3243 template<
class Archive>
3244 void load(Archive & ar,
const unsigned int version)
3248 BOOST_SERIALIZATION_SPLIT_MEMBER();
3286 template<
typename T>
3287 HyperVolume<T>
operator+(
const HyperVolume<T>& M1,
3288 const HyperVolume<T>& M2);
3296 template<
typename T>
3297 HyperVolume<T>
operator+(
const HyperVolume<T>& M1,
3306 template<
typename T>
3308 const HyperVolume<T>& M1);
3320 template<
typename T>
3321 HyperVolume<T>
operator-(
const HyperVolume<T>& M1,
3322 const HyperVolume<T>& M2);
3330 template<
typename T>
3331 HyperVolume<T>
operator-(
const HyperVolume<T>& M1,
3340 template<
typename T>
3342 const HyperVolume<T>& M1);
3354 template<
typename T>
3355 HyperVolume<T>
operator*(
const HyperVolume<T>& M1,
3356 const HyperVolume<T>& M2);
3364 template<
typename T>
3365 HyperVolume<T>
operator*(
const HyperVolume<T>& M1,
3374 template<
typename T>
3376 const HyperVolume<T>& M1);
3388 template<
typename T>
3389 HyperVolume<T>
operator/(
const HyperVolume<T>& M1,
3390 const HyperVolume<T>& M2);
3398 template<
typename T>
3399 HyperVolume<T>
operator/(
const HyperVolume<T>& M1,
3409 template<
typename T>
3410 T&
min(
const HyperVolume<T>& M1);
3418 template<
typename T>
3419 T&
max(
const HyperVolume<T>& M1);
3427 template<
typename T>
3428 HyperVolume<T>
abs(
const HyperVolume<T>& V);
3436 template<
typename T>
3437 HyperVolume<T>
sqrt(
const HyperVolume<T>& V);
3445 template<
typename T>
3446 HyperVolume<T>
cos(
const HyperVolume<T>& V);
3454 template<
typename T>
3455 HyperVolume<T>
acos(
const HyperVolume<T>& V);
3463 template<
typename T>
3464 HyperVolume<T>
sin(
const HyperVolume<T>& V);
3472 template<
typename T>
3473 HyperVolume<T>
asin(
const HyperVolume<T>& V);
3482 template<
typename T>
3483 HyperVolume<T>
tan(
const HyperVolume<T>& V);
3491 template<
typename T>
3492 HyperVolume<T>
atan(
const HyperVolume<T>& V);
3500 template<
typename T>
3501 HyperVolume<T>
exp(
const HyperVolume<T>& V);
3509 template<
typename T>
3510 HyperVolume<T>
log(
const HyperVolume<T>& V);
3518 template<
typename T>
3519 HyperVolume<T>
cosh(
const HyperVolume<T>& V);
3527 template<
typename T>
3528 HyperVolume<T>
sinh(
const HyperVolume<T>& V);
3536 template<
typename T>
3537 HyperVolume<T>
tanh(
const HyperVolume<T>& V);
3545 template<
typename T>
3546 HyperVolume<T>
log10(
const HyperVolume<T>& V);
3558 template<
typename T>
3564 template<
typename T>
3570 matrix_(new slip::
Matrix4d<T>(d1,d2,d3,d4))
3573 template<
typename T>
3580 matrix_(new slip::
Matrix4d<T>(d1,d2,d3,d4,val))
3583 template<
typename T>
3590 matrix_(new slip::
Matrix4d<T>(d1,d2,d3,d4,val))
3594 template<
typename T>
3597 matrix_(new slip::
Matrix4d<T>((*rhs.matrix_)))
3600 template<
typename T>
3613 template<
typename T>
3619 *matrix_ = *(rhs.matrix_);
3624 template<
typename T>
3628 std::fill_n((*matrix_)[0][0][0],matrix_->size(),value);
3632 template<
typename T>
3640 matrix_->resize(d1,d2,d3,d4,val);
3657 template<
typename T>
3661 return matrix_->begin();
3664 template<
typename T>
3668 return matrix_->end();
3671 template<
typename T>
3679 template<
typename T>
3688 template<
typename T>
3695 template<
typename T>
3702 template<
typename T>
3709 template<
typename T>
3721 template<
typename T>
3725 return matrix_->slab_begin(slice,row,col);
3729 template<
typename T>
3732 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col)
const{
3733 Matrix4d<T>
const * tp(matrix_);
3734 return tp->slab_begin(slice,row,col);
3737 template<
typename T>
3740 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col){
3741 return matrix_->slab_end(slice,row,col);
3745 template<
typename T>
3747 typename HyperVolume<T>::const_slab_iterator
HyperVolume<T>::slab_end(
const typename HyperVolume<T>::size_type slice,
3748 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col)
const{
3749 Matrix4d<T>
const * tp(matrix_);
3750 return tp->slab_end(slice,row,col);
3754 template<
typename T>
3757 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col){
3758 return matrix_->slab_rbegin(slice,row,col);
3761 template<
typename T>
3764 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col)
const{
3765 Matrix4d<T>
const * tp(matrix_);
3766 return tp->slab_rbegin(slice,row,col);
3770 template<
typename T>
3772 typename HyperVolume<T>::reverse_slab_iterator
HyperVolume<T>::slab_rend(
const typename HyperVolume<T>::size_type slice,
3773 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col){
3774 return matrix_->slab_rend(slice,row,col);
3777 template<
typename T>
3779 typename HyperVolume<T>::const_reverse_slab_iterator
HyperVolume<T>::slab_rend(
const typename HyperVolume<T>::size_type slice,
3780 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col)
const{
3781 Matrix4d<T>
const * tp(matrix_);
3782 return tp->slab_rend(slice,row,col);
3788 template<
typename T>
3790 typename HyperVolume<T>::slice_iterator
3792 const typename HyperVolume<T>::size_type col)
3794 return matrix_->slice_begin(slab,row,col);
3797 template<
typename T>
3799 typename HyperVolume<T>::const_slice_iterator
3801 const typename HyperVolume<T>::size_type col)
const
3803 Matrix4d<T>
const * tp(matrix_);
3804 return tp->slice_begin(slab,row,col);
3807 template<
typename T>
3809 typename HyperVolume<T>::slice_iterator
3811 const typename HyperVolume<T>::size_type col)
3813 return matrix_->slice_end(slab,row,col);
3816 template<
typename T>
3818 typename HyperVolume<T>::const_slice_iterator
3820 const typename HyperVolume<T>::size_type col)
const
3822 Matrix4d<T>
const * tp(matrix_);
3823 return tp->slice_end(slab,row,col);
3826 template<
typename T>
3828 typename HyperVolume<T>::reverse_slice_iterator
3830 const typename HyperVolume<T>::size_type col)
3832 return matrix_->slice_rbegin(slab,row,col);
3835 template<
typename T>
3837 typename HyperVolume<T>::const_reverse_slice_iterator
3839 const typename HyperVolume<T>::size_type col)
const
3841 Matrix4d<T>
const * tp(matrix_);
3842 return tp->slice_rbegin(slab,row,col);
3845 template<
typename T>
3847 typename HyperVolume<T>::reverse_slice_iterator
3849 const typename HyperVolume<T>::size_type col)
3851 return matrix_->slice_rend(slab,row,col);
3854 template<
typename T>
3856 typename HyperVolume<T>::const_reverse_slice_iterator
3858 const typename HyperVolume<T>::size_type col)
const
3860 Matrix4d<T>
const * tp(matrix_);
3861 return tp->slice_rend(slab,row,col);
3866 template<
typename T>
3868 typename HyperVolume<T>::row_iterator
3869 HyperVolume<T>::row_begin(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3870 const typename HyperVolume<T>::size_type row)
3872 return matrix_->row_begin(slab,slice,row);
3875 template<
typename T>
3877 typename HyperVolume<T>::const_row_iterator
3878 HyperVolume<T>::row_begin(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3879 const typename HyperVolume<T>::size_type row)
const
3881 Matrix4d<T>
const * tp(matrix_);
3882 return tp->row_begin(slab,slice,row);
3885 template<
typename T>
3887 typename HyperVolume<T>::row_iterator
3888 HyperVolume<T>::row_end(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3889 const typename HyperVolume<T>::size_type row)
3891 return matrix_->row_end(slab,slice,row);
3894 template<
typename T>
3896 typename HyperVolume<T>::const_row_iterator
3897 HyperVolume<T>::row_end(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3898 const typename HyperVolume<T>::size_type row)
const
3900 Matrix4d<T>
const * tp(matrix_);
3901 return tp->row_end(slab,slice,row);
3905 template<
typename T>
3907 typename HyperVolume<T>::reverse_row_iterator
3909 const typename HyperVolume<T>::size_type row)
3911 return matrix_->row_rbegin(slab,slice,row);
3914 template<
typename T>
3916 typename HyperVolume<T>::const_reverse_row_iterator
3918 const typename HyperVolume<T>::size_type row)
const
3920 Matrix4d<T>
const * tp(matrix_);
3921 return tp->row_rbegin(slab,slice,row);
3925 template<
typename T>
3927 typename HyperVolume<T>::reverse_row_iterator
3928 HyperVolume<T>::row_rend(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3929 const typename HyperVolume<T>::size_type row)
3931 return matrix_->row_rend(slab,slice,row);
3934 template<
typename T>
3936 typename HyperVolume<T>::const_reverse_row_iterator
3937 HyperVolume<T>::row_rend(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3938 const typename HyperVolume<T>::size_type row)
const
3940 Matrix4d<T>
const * tp(matrix_);
3941 return tp->row_rend(slab,slice,row);
3946 template<
typename T>
3948 typename HyperVolume<T>::col_iterator
3949 HyperVolume<T>::col_begin(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3950 const typename HyperVolume<T>::size_type col)
3952 return matrix_->col_begin(slab,slice,col);
3955 template<
typename T>
3957 typename HyperVolume<T>::const_col_iterator
3958 HyperVolume<T>::col_begin(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3959 const typename HyperVolume<T>::size_type col)
const
3961 Matrix4d<T>
const * tp(matrix_);
3962 return tp->col_begin(slab,slice,col);
3966 template<
typename T>
3968 typename HyperVolume<T>::col_iterator
3969 HyperVolume<T>::col_end(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3970 const typename HyperVolume<T>::size_type col)
3972 return matrix_->col_end(slab,slice,col);
3975 template<
typename T>
3977 typename HyperVolume<T>::const_col_iterator
3978 HyperVolume<T>::col_end(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
3979 const typename HyperVolume<T>::size_type col)
const
3981 Matrix4d<T>
const * tp(matrix_);
3982 return tp->col_end(slab,slice,col);
3985 template<
typename T>
3987 typename HyperVolume<T>::reverse_col_iterator
3989 const typename HyperVolume<T>::size_type col)
3991 return matrix_->col_rbegin(slab,slice,col);
3994 template<
typename T>
3996 typename HyperVolume<T>::const_reverse_col_iterator
3998 const typename HyperVolume<T>::size_type col)
const
4000 Matrix4d<T>
const * tp(matrix_);
4001 return tp->col_rbegin(slab,slice,col);
4005 template<
typename T>
4007 typename HyperVolume<T>::reverse_col_iterator
4008 HyperVolume<T>::col_rend(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
4009 const typename HyperVolume<T>::size_type col)
4011 return matrix_->col_rend(slab,slice,col);
4014 template<
typename T>
4016 typename HyperVolume<T>::const_reverse_col_iterator
4017 HyperVolume<T>::col_rend(
const typename HyperVolume<T>::size_type slab,
const typename HyperVolume<T>::size_type slice,
4018 const typename HyperVolume<T>::size_type col)
const
4020 Matrix4d<T>
const * tp(matrix_);
4021 return tp->col_rend(slab,slice,col);
4026 template<
typename T>
4029 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4031 return matrix_->slab_begin(slice,row,col,range);
4035 template<
typename T>
4037 typename HyperVolume<T>::slab_range_iterator
HyperVolume<T>::slab_end(
const typename HyperVolume<T>::size_type slice,
4038 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4040 return matrix_->slab_end(slice,row,col,range);
4044 template<
typename T>
4046 typename HyperVolume<T>::const_slab_range_iterator
HyperVolume<T>::slab_begin(
const typename HyperVolume<T>::size_type slice,
4047 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4049 Matrix4d<T>
const * tp(matrix_);
4050 return tp->slab_begin(slice,row,col,range);
4053 template<
typename T>
4055 typename HyperVolume<T>::const_slab_range_iterator
HyperVolume<T>::slab_end(
const typename HyperVolume<T>::size_type slice,
4056 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4058 Matrix4d<T>
const * tp(matrix_);
4059 return tp->slab_end(slice,row,col,range);
4062 template<
typename T>
4065 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4067 return matrix_->slab_rbegin(slice,row,col,range);
4071 template<
typename T>
4074 const HyperVolume<T>::size_type row,
const HyperVolume<T>::size_type col,
4076 return matrix_->slab_rend(slice,row,col,range);
4080 template<
typename T>
4082 typename HyperVolume<T>::const_reverse_slab_range_iterator
HyperVolume<T>::slab_rbegin(
const typename HyperVolume<T>::size_type slice,
4083 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4085 Matrix4d<T>
const * tp(matrix_);
4086 return tp->slab_rbegin(slice,row,col,range);
4089 template<
typename T>
4091 typename HyperVolume<T>::const_reverse_slab_range_iterator
HyperVolume<T>::slab_rend(
const typename HyperVolume<T>::size_type slice,
4092 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4094 Matrix4d<T>
const * tp(matrix_);
4095 return tp->slab_rend(slice,row,col,range);
4101 template<
typename T>
4103 typename HyperVolume<T>::slice_range_iterator
4105 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4108 return matrix_->slice_begin(slab,row,col,range);
4111 template<
typename T>
4113 typename HyperVolume<T>::const_slice_range_iterator
4115 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4118 Matrix4d<T>
const * tp(matrix_);
4119 return tp->slice_begin(slab,row,col,range);
4122 template<
typename T>
4124 typename HyperVolume<T>::slice_range_iterator
4126 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4129 return matrix_->slice_end(slab,row,col,range);
4132 template<
typename T>
4134 typename HyperVolume<T>::const_slice_range_iterator
4136 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4139 Matrix4d<T>
const * tp(matrix_);
4140 return tp->slice_end(slab,row,col,range);
4143 template<
typename T>
4145 typename HyperVolume<T>::reverse_slice_range_iterator
4147 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4150 return matrix_->slice_rbegin(slab,row,col,range);
4153 template<
typename T>
4155 typename HyperVolume<T>::const_reverse_slice_range_iterator
4157 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4160 Matrix4d<T>
const * tp(matrix_);
4161 return tp->slice_rbegin(slab,row,col,range);
4164 template<
typename T>
4166 typename HyperVolume<T>::reverse_slice_range_iterator
4168 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4171 return matrix_->slice_rend(slab,row,col,range);
4174 template<
typename T>
4176 typename HyperVolume<T>::const_reverse_slice_range_iterator
4178 const typename HyperVolume<T>::size_type row,
const typename HyperVolume<T>::size_type col,
4181 Matrix4d<T>
const * tp(matrix_);
4182 return tp->slice_rend(slab,row,col,range);
4187 template<
typename T>
4189 typename HyperVolume<T>::row_range_iterator
4191 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
const slip::Range<int>& range)
4193 return matrix_->row_begin(slab,slice,row,range);
4196 template<
typename T>
4198 typename HyperVolume<T>::const_row_range_iterator
4200 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4203 Matrix4d<T>
const * tp(matrix_);
4204 return tp->row_begin(slab,slice,row,range);
4207 template<
typename T>
4209 typename HyperVolume<T>::row_range_iterator
4211 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4214 return matrix_->row_end(slab,slice,row,range);
4217 template<
typename T>
4219 typename HyperVolume<T>::const_row_range_iterator
4221 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4224 Matrix4d<T>
const * tp(matrix_);
4225 return tp->row_end(slab,slice,row,range);
4228 template<
typename T>
4230 typename HyperVolume<T>::reverse_row_range_iterator
4232 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4235 return matrix_->row_rbegin(slab,slice,row,range);
4238 template<
typename T>
4240 typename HyperVolume<T>::const_reverse_row_range_iterator
4242 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4245 Matrix4d<T>
const * tp(matrix_);
4246 return tp->row_rbegin(slab,slice,row,range);
4249 template<
typename T>
4251 typename HyperVolume<T>::reverse_row_range_iterator
4253 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4256 return matrix_->row_rend(slab,slice,row,range);
4259 template<
typename T>
4261 typename HyperVolume<T>::const_reverse_row_range_iterator
4263 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type row,
4266 Matrix4d<T>
const * tp(matrix_);
4267 return tp->row_rend(slab,slice,row,range);
4272 template<
typename T>
4274 typename HyperVolume<T>::col_range_iterator
4276 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4279 return matrix_->col_begin(slab,slice,col,range);
4282 template<
typename T>
4284 typename HyperVolume<T>::const_col_range_iterator
4286 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4289 Matrix4d<T>
const * tp(matrix_);
4290 return tp->col_begin(slab,slice,col,range);
4293 template<
typename T>
4295 typename HyperVolume<T>::col_range_iterator
4297 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4300 return matrix_->col_end(slab,slice,col,range);
4303 template<
typename T>
4305 typename HyperVolume<T>::const_col_range_iterator
4307 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4310 Matrix4d<T>
const * tp(matrix_);
4311 return tp->col_end(slab,slice,col,range);
4314 template<
typename T>
4316 typename HyperVolume<T>::reverse_col_range_iterator
4318 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4321 return matrix_->col_rbegin(slab,slice,col,range);
4324 template<
typename T>
4326 typename HyperVolume<T>::const_reverse_col_range_iterator
4328 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4331 Matrix4d<T>
const * tp(matrix_);
4332 return tp->col_rbegin(slab,slice,col,range);
4335 template<
typename T>
4337 typename HyperVolume<T>::reverse_col_range_iterator
4339 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4342 return matrix_->col_rend(slab,slice,col,range);
4345 template<
typename T>
4347 typename HyperVolume<T>::const_reverse_col_range_iterator
4349 const typename HyperVolume<T>::size_type slice,
const typename HyperVolume<T>::size_type col,
4352 Matrix4d<T>
const * tp(matrix_);
4353 return tp->col_rend(slab,slice,col,range);
4363 template<
typename T>
4367 return matrix_->first_front_upper_left();
4370 template<
typename T>
4379 template<
typename T>
4383 return matrix_->last_back_bottom_right();
4386 template<
typename T>
4394 template<
typename T>
4399 return matrix_->rlast_back_bottom_right();
4402 template<
typename T>
4411 template<
typename T>
4416 return matrix_->rfirst_front_upper_left();
4419 template<
typename T>
4430 template<
typename T>
4434 return matrix_->first_front_upper_left(box);
4437 template<
typename T>
4446 template<
typename T>
4451 return matrix_->last_back_bottom_right(box);
4454 template<
typename T>
4463 template<
typename T>
4468 return matrix_->rlast_back_bottom_right(box);
4471 template<
typename T>
4480 template<
typename T>
4485 return matrix_->rfirst_front_upper_left(box);
4488 template<
typename T>
4499 template<
typename T>
4507 return matrix_->first_front_upper_left(slab_range,slice_range,row_range,col_range);
4510 template<
typename T>
4512 typename HyperVolume<T>::iterator4d_range
4514 const typename HyperVolume<T>::range& slice_range,
4515 const typename HyperVolume<T>::range& row_range,
4516 const typename HyperVolume<T>::range& col_range)
4518 return matrix_->last_back_bottom_right(slab_range,slice_range,row_range,col_range);
4522 template<
typename T>
4524 typename HyperVolume<T>::const_iterator4d_range
4526 const typename HyperVolume<T>::range& slice_range,
4527 const typename HyperVolume<T>::range& row_range,
4528 const typename HyperVolume<T>::range& col_range)
const
4530 Matrix4d<T>
const * tp(matrix_);
4531 return tp->first_front_upper_left(slab_range,slice_range,row_range,col_range);
4535 template<
typename T>
4537 typename HyperVolume<T>::const_iterator4d_range
4539 const typename HyperVolume<T>::range& slice_range,
4540 const typename HyperVolume<T>::range& row_range,
4541 const typename HyperVolume<T>::range& col_range)
const
4543 Matrix4d<T>
const * tp(matrix_);
4544 return tp->last_back_bottom_right(slab_range,slice_range,row_range,col_range);
4547 template<
typename T>
4549 typename HyperVolume<T>::reverse_iterator4d_range
4551 const typename HyperVolume<T>::range& slice_range,
4552 const typename HyperVolume<T>::range& row_range,
4553 const typename HyperVolume<T>::range& col_range)
4555 return matrix_->rfirst_front_upper_left(slab_range,slice_range,row_range,col_range);
4558 template<
typename T>
4560 typename HyperVolume<T>::const_reverse_iterator4d_range
4562 const typename HyperVolume<T>::range& slice_range,
4563 const typename HyperVolume<T>::range& row_range,
4564 const typename HyperVolume<T>::range& col_range)
const
4566 Matrix4d<T>
const * tp(matrix_);
4567 return tp->rfirst_front_upper_left(slab_range,slice_range,row_range,col_range);
4570 template<
typename T>
4572 typename HyperVolume<T>::reverse_iterator4d_range
4574 const typename HyperVolume<T>::range& slice_range,
4575 const typename HyperVolume<T>::range& row_range,
4576 const typename HyperVolume<T>::range& col_range)
4578 return matrix_->rlast_back_bottom_right(slab_range,slice_range,row_range,col_range);
4581 template<
typename T>
4583 typename HyperVolume<T>::const_reverse_iterator4d_range
4585 const typename HyperVolume<T>::range& slice_range,
4586 const typename HyperVolume<T>::range& row_range,
4587 const typename HyperVolume<T>::range& col_range)
const
4589 Matrix4d<T>
const * tp(matrix_);
4590 return tp->rlast_back_bottom_right(slab_range,slice_range,row_range,col_range);
4597 template <
typename T>
4599 std::ostream& operator<<(std::ostream & out, const HyperVolume<T>& a)
4612 template<
typename T>
4617 return (*matrix_)[l];
4620 template<
typename T>
4625 Matrix4d<T>
const * tp(matrix_);
4626 return tp->operator[](l);
4629 template<
typename T>
4631 typename HyperVolume<T>::reference
4633 const typename HyperVolume<T>::size_type k,
4634 const typename HyperVolume<T>::size_type i,
4635 const typename HyperVolume<T>::size_type j)
4637 return (*matrix_)[l][k][i][j];
4640 template<
typename T>
4642 typename HyperVolume<T>::const_reference
4644 const typename HyperVolume<T>::size_type k,
4645 const typename HyperVolume<T>::size_type i,
4646 const typename HyperVolume<T>::size_type j)
const
4648 return (*matrix_)[l][k][i][j];
4653 template<
typename T>
4658 template<
typename T>
4663 template<
typename T>
4668 template<
typename T>
4673 template<
typename T>
4678 template<
typename T>
4683 template<
typename T>
4688 template<
typename T>
4693 template<
typename T>
4698 template<
typename T>
4704 template<
typename T>
4709 template<
typename T>
4714 template<
typename T>
4718 template<
typename T>
4722 matrix_->swap(*(M.matrix_));
4728 template<
typename T>
4737 template<
typename T>
4749 template<
typename T>
4751 bool operator<(const HyperVolume<T>& x,
4754 return std::lexicographical_compare(x.begin(), x.end(),
4755 y.begin(), y.end());
4759 template<
typename T>
4767 template<
typename T>
4769 bool operator<=(const HyperVolume<T>& x,
4775 template<
typename T>
4789 template<
typename T>
4793 std::transform(matrix_->begin(),matrix_->end(),matrix_->begin(),std::bind2nd(std::plus<T>(),val));
4797 template<
typename T>
4801 std::transform(matrix_->begin(),matrix_->end(),matrix_->begin(),std::bind2nd(std::minus<T>(),val));
4805 template<
typename T>
4809 std::transform(matrix_->begin(),matrix_->end(),matrix_->begin(),std::bind2nd(std::multiplies<T>(),val));
4813 template<
typename T>
4817 std::transform(matrix_->begin(),matrix_->end(),matrix_->begin(),std::bind2nd(std::divides<T>(),val));
4821 template<
typename T>
4826 std::transform(matrix_->begin(),matrix_->end(),tmp.
begin(),std::negate<T>());
4830 template<
typename T>
4834 assert(this->dim1() == rhs.
dim1());
4835 assert(this->dim2() == rhs.
dim2());
4836 assert(this->dim3() == rhs.
dim3());
4837 assert(this->dim4() == rhs.
dim4());
4839 std::transform(matrix_->begin(),matrix_->end(),(*(rhs.matrix_)).begin(),matrix_->begin(),std::plus<T>());
4843 template<
typename T>
4847 assert(this->dim1() == rhs.
dim1());
4848 assert(this->dim2() == rhs.
dim2());
4849 assert(this->dim3() == rhs.
dim3());
4850 assert(this->dim4() == rhs.
dim4());
4851 std::transform(matrix_->begin(),matrix_->end(),(*(rhs.matrix_)).begin(),matrix_->begin(),std::minus<T>());
4855 template<
typename T>
4859 assert(this->dim1() == rhs.
dim1());
4860 assert(this->dim2() == rhs.
dim2());
4861 assert(this->dim3() == rhs.
dim3());
4862 assert(this->dim4() == rhs.
dim4());
4863 std::transform(matrix_->begin(),matrix_->end(),(*(rhs.matrix_)).begin(),matrix_->begin(),std::multiplies<T>());
4867 template<
typename T>
4871 assert(this->size() == rhs.
size());
4872 std::transform(matrix_->begin(),matrix_->end(),(*(rhs.matrix_)).begin(),matrix_->begin(),std::divides<T>());
4878 template<
typename T>
4882 assert(matrix_->size() != 0);
4883 return *std::min_element(matrix_->begin(),matrix_->end());
4886 template<
typename T>
4890 assert(matrix_->size() != 0);
4891 return *std::max_element(matrix_->begin(),matrix_->end());
4894 template<
typename T>
4898 assert(matrix_->size() != 0);
4899 return std::accumulate(matrix_->begin(),matrix_->end(),T());
4903 template<
typename T>
4907 slip::apply(this->begin(),this->end(),this->begin(),fun);
4911 template<
typename T>
4915 slip::apply(this->begin(),this->end(),this->begin(),fun);
4922 template<
typename T>
4933 std::transform(M1.
begin(),M1.
end(),M2.
begin(),tmp.begin(),std::plus<T>());
4937 template<
typename T>
4947 template<
typename T>
4956 template<
typename T>
4967 std::transform(M1.
begin(),M1.
end(),M2.
begin(),tmp.begin(),std::minus<T>());
4971 template<
typename T>
4981 template<
typename T>
4989 template<
typename T>
5000 std::transform(M1.
begin(),M1.
end(),M2.
begin(),tmp.begin(),std::multiplies<T>());
5004 template<
typename T>
5014 template<
typename T>
5022 template<
typename T>
5033 std::transform(M1.
begin(),M1.
end(),M2.
begin(),tmp.begin(),std::divides<T>());
5037 template<
typename T>
5048 template<
typename T>
5055 template<
typename T>
5062 template<
typename T>
5072 template<
typename T>
5081 template<
typename T>
5090 template<
typename T>
5099 template<
typename T>
5108 template<
typename T>
5117 template<
typename T>
5126 template<
typename T>
5135 template<
typename T>
5144 template<
typename T>
5153 template<
typename T>
5162 template<
typename T>
5171 template<
typename T>
5180 template<
typename T>
5193 #endif //SLIP_HYPER_VOLUME_HPP
slip::stride_iterator< pointer > slice_iterator
std::reverse_iterator< col_range_iterator > reverse_col_range_iterator
T & max() const
Returns the max element of the HyperVolume according to the operator <.
HyperVolume< T > tanh(const HyperVolume< T > &M)
bool operator!=(const Array< T > &x, const Array< T > &y)
This is some iterator to iterate a 4d container into a Box area defined by the subscripts of the 4d c...
iterator4d first_front_upper_left()
Returns a read/write iterator4d that points to the first element of the Matrix4d. It points to the fi...
slip::stride_iterator< const_pointer > const_row_range_iterator
iterator4d last_back_bottom_right()
Returns a read/write iterator4d that points to the past the end element of the HyperVolume. It points to past the end element of the last back bottom right element of the HyperVolume.
reverse_iterator4d rfirst_front_upper_left()
Returns a read/write reverse iterator4d. It points to the last back bottom right element of the Matri...
T *** operator[](const size_type l)
reverse_iterator rend()
Returns a read/write reverse iterator that points to one before the first element in the HyperVolume...
slice_iterator slice_end(const size_type slab, const size_type row, const size_type col)
Returns a read/write iterator that points to the one past the end element of the line (slab...
iterator4d last_back_bottom_right()
Returns a read/write iterator4d that points to the past the end element of the Matrix4d. It points to past the end element of the last back bottom right element of the Matrix4d.
reverse_row_iterator row_rbegin(const size_type slab, const size_type slice, const size_type row)
Returns a read/write reverse iterator that points to the last element of the row row of a given slab ...
HyperVolume(const size_type d1, const size_type d2, const size_type d3, const size_type d4, InputIterator first, InputIterator last)
Contructs a HyperVolume from a range.
col_iterator col_end(const size_type slab, const size_type slice, const size_type col)
Returns a read/write iterator that points to the past-the-end element of the column column of a given...
std::reverse_iterator< const_row_range_iterator > const_reverse_row_range_iterator
const value_type * const_pointer
std::reverse_iterator< slab_range_iterator > reverse_slab_range_iterator
size_type slices() const
Returns the number of slices (second dimension size) in the HyperVolume.
size_type dim2() const
Returns the number of slices (second dimension size) in the HyperVolume.
size_type max_size() const
Returns the maximal size (number of elements) in the HyperVolume.
col_iterator col_begin(const size_type slab, const size_type slice, const size_type col)
Returns a read/write iterator that points to the first element of the column column of a given slab s...
slip::HyperVolume< unsigned long > HyperVolume_ul
unsigned long alias
iterator4d default_iterator
HyperVolume< T > & apply(T(*fun)(T))
Applys the one-parameter C-function fun to each element of the HyperVolume.
This is some iterator to iterate a 4d container into two Range defined by the indices and strides of ...
reverse_iterator4d rfirst_front_upper_left()
Returns a read/write reverse iterator4d. It points to the last back bottom right element of the Hyper...
slip::stride_iterator< const_slab_iterator > const_slab_range_iterator
std::reverse_iterator< slice_iterator > reverse_slice_iterator
HyperVolume< T > cosh(const HyperVolume< T > &M)
Numerical matrix4d class. This container statisfies the RandomAccessContainer concepts of the STL exc...
slip::HyperVolume< float > HyperVolume_f
float alias
std::reverse_iterator< iterator4d_range > reverse_iterator4d_range
T & min(const GrayscaleImage< T > &M1)
Returns the min element of a GrayscaleImage.
row_iterator row_end(const size_type slab, const size_type slice, const size_type row)
Returns a read/write iterator that points to the past-the-end element of the row row of a given slab ...
slip::Array4d< T >::const_iterator4d const_iterator4d
This is some iterator to iterate a 4d container into a Box area defined by the subscripts of the 4d c...
Color< T > operator+(const Color< T > &V1, const Color< T > &V2)
const_iterator4d const_default_iterator
std::reverse_iterator< row_range_iterator > reverse_row_range_iterator
const value_type & const_reference
T sum() const
Returns the sum of the elements of the HyperVolume.
size_type cols() const
Returns the number of columns (fourth dimension size) in the HyperVolume.
slice_iterator slice_begin(const size_type slab, const size_type row, const size_type col)
Returns a read/write iterator that points to the first element of the line (slab,row,col) through the slices in the HyperVolume. Iteration is done in ordinary element order (increasing slice number).
HyperVolume< T > atan(const HyperVolume< T > &M)
std::reverse_iterator< const_slab_range_iterator > const_reverse_slab_range_iterator
slip::stride_iterator< const_pointer > const_slice_iterator
slip::stride_iterator< const_pointer > const_slab_iterator
size_type rows() const
Returns the number of rows (third dimension size) in the HyperVolume.
friend class boost::serialization::access
self & operator*=(const T &val)
std::reverse_iterator< const_iterator4d_range > const_reverse_iterator4d_range
HyperVolume< T > exp(const HyperVolume< T > &M)
std::reverse_iterator< col_iterator > reverse_col_iterator
size_type dim4() const
Returns the number of columns (fourth dimension size) in the HyperVolume.
Provides a class to manipulate Matrix4d.
slip::stride_iterator< pointer > col_iterator
std::reverse_iterator< const_iterator4d > const_reverse_iterator4d
HyperVolume< T > abs(const HyperVolume< T > &M)
bool operator>(const Array< T > &x, const Array< T > &y)
slip::stride_iterator< slice_iterator > slice_range_iterator
reverse_slice_iterator slice_rbegin(const size_type slab, const size_type row, const size_type col)
Returns a read/write iterator that points to the last element of the line (slab,row,col) through the slices in the HyperVolume. Iteration is done in reverse element order (decreasing slice number).
size_type slabs() const
Returns the number of slabs (first dimension size) in the HyperVolume.
HyperVolume< T > sin(const HyperVolume< T > &M)
std::reverse_iterator< iterator > reverse_row_iterator
Numerical container class This is a four-dimensional dynamic and generic container. This container satisfies the BidirectionnalContainer concepts of the STL. It is also an 4d extension of the RandomAccessContainer concept. That is to say the bracket element access is replaced by the triple bracket element access. Data are stored using a Matrix4d class. It extends the interface of Matrix4d adding image read/write operations. These operations are done using the ImageMagick library.
self & operator/=(const T &val)
HyperVolume< T > cos(const HyperVolume< T > &M)
void fill(const T *value)
Fills the container range [begin(),begin()+size()) with a copy of the value array.
reverse_slab_iterator slab_rbegin(const size_type slice, const size_type row, const size_type col)
Returns a read/write iterator that points to the last element of the line (slice,row,col) through the slabs in the HyperVolume. Iteration is done in reverse element order (decreasing slab number).
const_pointer const_iterator
void swap(HyperVolume &M)
Swaps data with another HyperVolume.
slip::stride_iterator< const_slice_iterator > const_slice_range_iterator
HyperVolume()
Constructs a HyperVolume.
size_type columns() const
Returns the number of columns (fourth dimension size) in the HyperVolume.
std::reverse_iterator< iterator > reverse_iterator
slip::HyperVolume< short > HyperVolume_s
short alias
bool empty() const
Returns true if the HyperVolume is empty. (Thus size() == 0)
slip::stride_iterator< slab_iterator > slab_range_iterator
row_iterator row_begin(const size_type slab, const size_type slice, const size_type row)
Returns a read/write iterator that points to the first element of the row row of a given slab slab an...
slip::Array4d< T >::iterator4d iterator4d
const_pointer const_row_iterator
std::reverse_iterator< const_col_range_iterator > const_reverse_col_range_iterator
self & operator-=(const T &val)
iterator4d first_front_upper_left()
Returns a read/write iterator4d that points to the first element of the HyperVolume. It points to the first front upper left element of the HyperVolume.
const_iterator begin() const
Returns a read-only (constant) iterator that points to the first element in the Matrix4d. Iteration is done in ordinary element order.
~HyperVolume()
Destructor of the HyperVolume.
void copy(_II first, _II last, _OI output_first)
Copy algorithm optimized for slip iterators.
reverse_slice_iterator slice_rend(const size_type slab, const size_type row, const size_type col)
Returns a read/write iterator that points to the one before the first element of the line (slab...
slip::Array4d< T >::iterator4d_range iterator4d_range
size_type dim1() const
Returns the number of slabs (first dimension size) in the HyperVolume.
void fill(const T &value)
Fills the container range [begin(),begin()+size()) with copies of value.
slab_iterator slab_end(const size_type slice, const size_type row, const size_type col)
Returns a read/write iterator that points to the one past the end element of the line (slice...
reverse_row_iterator row_rend(const size_type slab, const size_type slice, const size_type row)
Returns a read/write reverse iterator that points to the first element of the row row of a given slab...
iterator end()
Returns a read/write iterator that points one past the last element in the Matrix4d. Iteration is done in ordinary element order.
reverse_col_iterator col_rend(const size_type slab, const size_type slice, const size_type col)
Returns a read/write reverse iterator that points to the first element of the column column of a give...
reference operator()(const size_type l, const size_type k, const size_type i, const size_type j)
Subscript access to the data contained in the HyperVolume.
HyperVolume< T > sqrt(const HyperVolume< T > &M)
slip::stride_iterator< const_pointer > const_col_iterator
HyperVolume< T > sinh(const HyperVolume< T > &M)
slip::HyperVolume< long > HyperVolume_l
long alias
slip::HyperVolume< unsigned char > HyperVolume_uc
unsigned char alias
ptrdiff_t difference_type
void resize(std::size_t d1, std::size_t d2, std::size_t d3, std::size_t d4, const T &val=T())
Resizes a HyperVolume.
reverse_slab_iterator slab_rend(const size_type slice, const size_type row, const size_type col)
Returns a read/write iterator that points to the one before the first element of the line (slice...
HyperVolume< T > log(const HyperVolume< T > &M)
std::reverse_iterator< const_iterator > const_reverse_row_iterator
std::string name() const
Returns the name of the class.
Some const iterator to iterate a 4d container into two Range defined by the indices and strides of th...
slip::stride_iterator< col_iterator > col_range_iterator
HyperVolume< T > acos(const HyperVolume< T > &M)
std::reverse_iterator< slice_range_iterator > reverse_slice_range_iterator
std::reverse_iterator< slab_iterator > reverse_slab_iterator
slip::stride_iterator< pointer > slab_iterator
std::reverse_iterator< const_slab_iterator > const_reverse_slab_iterator
slab_iterator slab_begin(const size_type slice, const size_type row, const size_type col)
Returns a read/write iterator that points to the first element of the line (slice,row,col) through the slabs in the HyperVolume. Iteration is done in ordinary element order (increasing slab number).
HyperVolume< T > log10(const HyperVolume< T > &M)
slip::HyperVolume< unsigned short > HyperVolume_us
unsigned long alias
reverse_iterator4d rlast_back_bottom_right()
Returns a read/write reverse iterator4d. It points to past the first front upper left element of the ...
const_iterator begin() const
Returns a read-only (constant) iterator that points to the first element in the HyperVolume. Iteration is done in ordinary element order.
slip::HyperVolume< char > HyperVolume_c
char alias
T & min() const
Returns the min element of the HyperVolume according to the operator <.
std::reverse_iterator< const_slice_iterator > const_reverse_slice_iterator
std::reverse_iterator< const_col_iterator > const_reverse_col_iterator
slip::Array4d< T >::const_iterator4d_range const_iterator4d_range
slip::stride_iterator< pointer > row_range_iterator
Provides some algorithms to apply C like functions to ranges.
Provides a class to manipulate iterator4d within a slip::Range. It is used to iterate throw 4d contai...
Provides a class to iterate a 1d range according to a step.
self & operator=(const HyperVolume< T > &rhs)
Assign a HyperVolume.
HyperVolume< T > tan(const HyperVolume< T > &M)
size_type dim3() const
Returns the number of rows (third dimension size) in the HyperVolume.
reverse_col_iterator col_rbegin(const size_type slab, const size_type slice, const size_type col)
Returns a read/write reverse iterator that points to the last element of the column column of a given...
bool operator==(const Array< T > &x, const Array< T > &y)
HyperVolume< T > asin(const HyperVolume< T > &M)
slip::HyperVolume< unsigned int > HyperVolume_ui
unsigned int alias
Provides a class to manipulate iterator4d within a slip::Box4d. It is used to iterate throw 4d contai...
Color< T > operator*(const Color< T > &V1, const Color< T > &V2)
self & operator+=(const T &val)
Add val to each element of the HyperVolume.
slip::HyperVolume< double > HyperVolume_d
double alias
reverse_iterator4d rlast_back_bottom_right()
Returns a read/write reverse iterator4d. It points to past the first front upper left element of the ...
std::reverse_iterator< const_iterator > const_reverse_iterator
void apply(InputIterator first, InputIterator last, OutputIterator result, typename std::iterator_traits< OutputIterator >::value_type(*function)(typename std::iterator_traits< InputIterator >::value_type))
Applies a C-function to each element of a range.
T & max(const GrayscaleImage< T > &M1)
Returns the max element of a GrayscaleImage.
Color< T > operator/(const Color< T > &V1, const Color< T > &V2)
iterator end()
Returns a read/write iterator that points one past the last element in the HyperVolume. Iteration is done in ordinary element order.
std::reverse_iterator< const_slice_range_iterator > const_reverse_slice_range_iterator
std::reverse_iterator< iterator4d > reverse_iterator4d
bool operator>=(const Array< T > &x, const Array< T > &y)
slip::stride_iterator< const_col_iterator > const_col_range_iterator
Color< T > operator-(const Color< T > &V1, const Color< T > &V2)
static const std::size_t DIM
void fill(InputIterator first, InputIterator last)
Fills the container range [begin(),begin()+size()) with a copy of the range [first,last)
reverse_iterator rbegin()
Returns a read/write reverse iterator that points to the last element in the HyperVolume. Iteration is done in reverse element order.
size_type size() const
Returns the number of elements in the HyperVolume.
slip::HyperVolume< int > HyperVolume_i
int alias