#include "sopnamsp.h" #include "machdefs.h" #include #include "bitvector.h" #include "pexceptions.h" #include "fiondblock.h" namespace SOPHYA { //! create a vecsize element vector than can handle AT LEAST nbits bits (set to 0) BitVector::BitVector(uint_8 nbits,uint_4 vecsize) : nbits_(nbits), vecsize_(vecsize) { if(vecsize_==0) vecsize_ = 128; bitpervec_ = vecsize_ * BitVec_BITPERWORD_; nvector_ = nbits_ / bitpervec_ + 1; for(uint_8 i=0;i V(vecsize_); V = (BitVec_Type)0; vv_.push_back(V); } nbits_ = nvector_ * bitpervec_; } //! copy constructor: data are shared BitVector::BitVector(BitVector const& bv) : nbits_(bv.nbits_), vecsize_(bv.vecsize_), bitpervec_(bv.bitpervec_), nvector_(bv.nvector_) { if(nvector_==0) return; // attention: partage de reference for(uint_8 i=0;i V(vecsize_); V = (BitVec_Type)0; vv_.push_back(V); } nvector_ = vv_.size(); nbits_ = nvector_ * bitpervec_; } //! operator = : data are duplcated BitVector& BitVector::operator = (const BitVector& bv) { if(this == &bv) return *this; nbits_ = bv.nbits_; vecsize_ = bv.vecsize_; bitpervec_ = vecsize_ * BitVec_BITPERWORD_; nvector_ = bv.nvector_; vv_.resize(0); if(nvector_!=0) { for(uint_8 i=0;i V(bv.vv_[i],false); // copie des donnees vv_.push_back(V); } } return *this; } // set all bit vector to v BitVector& BitVector::operator = (bool v) { if(nvector_==0) return *this; BitVec_Type veltv = 0; if(v) veltv = ~veltv; for(uint_8 i=0;iSet(i,(bool)v); } if(putextra!=0 && nbits_>nbits) { bool v = (putextra>0) ? true: false; for(uint_8 i=nbits;iSet(i,v); } return *this; } /*! make OR between 2 vectors \verbatim If (*this) has extra length: putextra = -1 : put extra bits to false = 0 : let extra bits to their value = +1 : put extra bits to true \endverbatim */ BitVector& BitVector::OR(const BitVector& bv,int putextra) { uint_8 nbits = (nbits_<=bv.nbits_) ? nbits_: bv.nbits_; if(nbits==0) return *this; for(uint_8 i=0;iSet(i,(bool)v); } if(putextra!=0 && nbits_>nbits) { bool v = (putextra>0) ? true: false; for(uint_8 i=nbits;iSet(i,v); } return *this; } // negate all bits BitVector& BitVector::Negate(void) { if(nvector_==0) return *this; for(uint_8 i=0;i=nbits_) throw(RangeCheckError("bool BitVector::operator(): indices out of range \n")); uint_8 nv = k / bitpervec_; // numero du vecteur k %= bitpervec_; uint_8 iv = k / BitVec_BITPERWORD_; // numero de l'element du vecteur k %= BitVec_BITPERWORD_; // numero de bit dans l'element du vecteur return ( vv_[nv](iv) & (1ULL<nbits_) extend_(k); uint_8 nv = k / bitpervec_; // numero du vecteur k %= bitpervec_; uint_8 iv = k / BitVec_BITPERWORD_; // numero de l'element du vecteur k %= BitVec_BITPERWORD_; // numero de bit dans l'element du vecteur if(v) vv_[nv](iv) |= (1ULL<=nbits_) return; if(k2=nbits_) k2 = nbits_ - 1; for(uint_8 k=k1;k<=k2;k++) Set(k,v); } //! Return the number of bits with value v (true/false) uint_8 BitVector::NValues(bool v) { uint_8 n = 0; if(nbits_==0) return n; for(uint_8 i=0;i=nbits_ || dk==0) return; uint_8 k2 = k1 + dk; if(k2>nbits_ || k2<=k1) k2 = nbits_; if(k1!=0) cout<<"print ["< , pour SGI-CC en particulier */ void ObjFileIO::WriteSelf(POutPersist& s) const { if (dobj == NULL) return; s.Put(dobj->nbits_); s.Put(dobj->vecsize_); s.Put(dobj->bitpervec_); s.Put(dobj->nvector_); if(dobj->nvector_==0) return; /* A REMPLACER par l'ecriture directe de vector< NDataBlock > */ for(uint_8 i=0;invector_;i++) s << dobj->vv_[i]; return; } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void ObjFileIO::ReadSelf(PInPersist& s) { if (dobj == NULL) dobj = new BitVector; else dobj->delete_(); s.Get(dobj->nbits_); s.Get(dobj->vecsize_); s.Get(dobj->bitpervec_); s.Get(dobj->nvector_); if(dobj->nvector_==0) return; /* A REMPLACER par la lecture directe de vector< NDataBlock > */ for(uint_8 i=0;invector_;i++) { NDataBlock V; s >> V; dobj->vv_.push_back(V); } return; } #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template ObjFileIO #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class ObjFileIO; #endif } // FIN namespace SOPHYA