📄 valarray.cc
字号:
}
// copy ctor and assignment for slice
template <class T>
valarray<T>::valarray(const slice_array<T>& sl_ar)
{
valarray<T> tmp_array(sl_ar.get_slice().size());
size_t ind = sl_ar.get_slice().start();
size_t cpt = 0;
while( cpt < sl_ar.get_slice().size() )
{
tmp_array[cpt] = (*(sl_ar.get_ref_mem_array()))[ind];
ind+= sl_ar.get_slice().stride();
cpt++;
}
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),sl_ar.get_slice().size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
}
template <class T>
valarray<T>& valarray<T>::operator= (const slice_array<T>& sl_ar)
{
valarray<T> tmp_array(sl_ar.get_slice().size());
size_t ind = sl_ar.get_slice().start();
size_t cpt = 0;
while( cpt < sl_ar.get_slice().size() )
{
tmp_array[cpt] = (*(sl_ar.get_ref_mem_array()))[ind];
ind+= sl_ar.get_slice().stride();
cpt++;
}
if ( &memory_array == sl_ar.get_ref_mem_array() )
memory_array._RW_resize_without_copy(0);
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),sl_ar.get_slice().size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return *this;
}
// operator[] for gslice
template <class T>
valarray<T> valarray<T>::operator[](const gslice& sl) const
{
valarray<T> tmp_array(sl.ind_numb());
gslice *gsl = (gslice *)&sl;
size_t ind = gsl->next_ind();
size_t cpt = 0;
while( !sl.is_reseted() )
{
tmp_array[cpt] = memory_array[ind];
ind= gsl->next_ind();
cpt++;
}
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = tmp_array.size();
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
// copy ctor and assignment for gslice
template <class T>
valarray<T>::valarray(const gslice_array<T>& sl_ar)
{
gslice sl(sl_ar.get_slice());
valarray<T> tmp_array(sl.ind_numb());
size_t ind = sl.next_ind();
size_t cpt = 0;
while( !sl.is_reseted() )
{
tmp_array[cpt] = (*(sl_ar.get_ref_mem_array()))[ind];
ind= sl.next_ind();
cpt++;
}
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),tmp_array.size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
}
template <class T>
valarray<T>& valarray<T>::operator= (const gslice_array<T>& sl_ar)
{
gslice sl(sl_ar.get_slice());
valarray<T> tmp_array(sl.ind_numb());
size_t ind = sl.next_ind();
size_t cpt = 0;
while( !sl.is_reseted() )
{
tmp_array[cpt] = (*(sl_ar.get_ref_mem_array()))[ind];
ind= sl.next_ind();
cpt++;
}
if ( &memory_array == sl_ar.get_ref_mem_array() )
memory_array._RW_resize_without_copy(0);
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),tmp_array.size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return *this;
}
// operator[] for valarray[valarray<bool>] used with mask_array
template <class T>
valarray<T> valarray<T>::operator[](const valarray<bool>& array) const
{
size_t iter,size =0;
for(iter=0; iter < array.size(); iter++ )
if ( array[iter] ) size++;
valarray<T> tmp_array(size);
size_t cpt = 0;
for( iter=0; iter < array.size(); iter++ )
if ( array[iter] ) tmp_array[cpt++] = memory_array[iter];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = size;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
// copy ctor and assignment for mask_array
template <class T>
valarray<T>::valarray(const mask_array<T>& mask)
{
mask_array<T> *msk = (mask_array<T> *)&mask;
valarray<bool>* sec = msk->get_array_pt();
size_t iter,size =0;
for(iter=0; iter < sec->size(); iter++ )
if ( (*sec)[iter] ) size++;
valarray<T> tmp_array(size);
size_t cpt = 0;
for( iter=0; iter < sec->size(); iter++ )
if ( (*sec)[iter] ) tmp_array[cpt++] = (*(mask.get_ref_mem_array()))[iter];
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),size);
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
}
template <class T>
valarray<T>& valarray<T>::operator= (const mask_array<T>& mask)
{
mask_array<T> *msk = (mask_array<T> *)&mask;
valarray<bool>* sec = msk->get_array_pt();
size_t iter,size =0;
for(iter=0; iter < sec->size(); iter++ )
if ( (*sec)[iter] ) size++;
valarray<T> tmp_array(size);
size_t cpt = 0;
for( iter=0; iter < sec->size(); iter++ )
if ( (*sec)[iter] ) tmp_array[cpt++] = (*(mask.get_ref_mem_array()))[iter];
if ( &memory_array == mask.get_ref_mem_array() )
memory_array._RW_resize_without_copy(0);
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),size);
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return *this;
}
// operator[] for valarray[valarray<size_t>] used with indirect_array
template <class T>
valarray<T> valarray<T>::operator[](const valarray<size_t>& array) const
{
valarray<T> tmp_array(array.size());
for( size_t iter=0; iter < array.size(); iter++ )
tmp_array[iter] = memory_array[array[iter]];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = array.size();
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
// copy ctor and assignment for indirect_array
template <class T>
valarray<T>::valarray(const indirect_array<T>& indir)
{
indirect_array<T> *indr= (indirect_array<T> *)&indir;
valarray<size_t>* sec = indr->get_array_pt();
valarray<T> tmp_array(sec->size());
size_t cpt = 0;
for(size_t iter=0; iter < sec->size(); iter++ )
tmp_array[cpt++] = (*(indir.get_ref_mem_array()))[(*sec)[iter]];
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),sec->size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
}
template <class T>
valarray<T>& valarray<T>::operator= (const indirect_array<T>& indir)
{
indirect_array<T> *indr= (indirect_array<T> *)&indir;
valarray<size_t>* sec = indr->get_array_pt();
valarray<T> tmp_array(sec->size());
size_t cpt = 0;
for(size_t iter=0; iter < sec->size(); iter++ )
tmp_array[cpt++] = (*(indir.get_ref_mem_array()))[(*sec)[iter]];
if ( &memory_array == indir.get_ref_mem_array() )
memory_array._RW_resize_without_copy(0);
memory_array._replace(tmp_array._RW_get_memory_array()._RW_get_storage(),sec->size());
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return *this;
}
/*
*
* VALARRAY NON MEMBER FUNCTIONS
*
*/
template<class T>
valarray<T> operator* (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]*b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator/ (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]/b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator% (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]%b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator+ (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]+b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator- (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]-b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator^ (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]^b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator& (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]&b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator| (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]|b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator<< (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]<<b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
return _tmp_ret;
}
template<class T>
valarray<T> operator>> (const valarray<T>& a, const valarray<T>& b)
{
size_t length= ( a.size() > b.size() ) ? b.size() : a.size();
valarray<T> tmp_array(length);
for(size_t ind=0; ind< length; ind++ )
tmp_array[ind] = a[ind]>>b[ind];
_RW_IMP_SPACE(_RW_temporary<T>)* _tmp_ret = new _RW_IMP_SPACE(_RW_temporary<T>);
_tmp_ret->store_adr = tmp_array._RW_get_memory_array()._RW_get_storage();
_tmp_ret->length = length;
tmp_array._RW_get_memory_array_adr()->_RW_invalidate();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -