diff -r f497542af8e4 -r 538db54a451d userlibandfileserver/fileserver/fs_utils/bit_vector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/fs_utils/bit_vector.h Mon Jan 18 21:31:10 2010 +0200 @@ -0,0 +1,251 @@ +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +// Collection of common constants, utility functions, etc. for the file server and file systems. +// Definitions here must be filesystem-agnostic, i.e. generic enougs to be used by every file system +// +// This is the internal file and must not be exported. + +/** + @file + @internalTechnology +*/ + +#if !defined(__FILESYSTEM_UTILS_BIT_VECTOR__) +#define __FILESYSTEM_UTILS_BIT_VECTOR__ + +#if !defined(__FILESYSTEM_UTILS_H__) +#include "filesystem_utils.h" +#endif + + +//####################################################################################################################################### + +/** + This class represents a bit vector i.e. an array of bits. Vector size can be from 1 to 2^32 bits. + This class can be created on a stack (but needs to be placed into cleanup stack) or in a heap with the help of its factory methods Create/CreateL +*/ +class RBitVector + { + public: + + RBitVector(); //-- Creates an empty vector. see Create() methods for memory allocation + ~RBitVector(); + + void Close(); + + TInt Create(TUint32 aNumBits); + void CreateL(TUint32 aNumBits); + + inline TUint32 Size() const; + + //-- single bit manipulation methods + inline TBool operator[](TUint32 aIndex) const; + inline void SetBit(TUint32 aIndex); + inline void ResetBit(TUint32 aIndex); + inline void InvertBit(TUint32 aIndex); + inline void SetBitVal(TUint32 aIndex, TBool aVal); + + void Fill(TBool aVal); + void Fill(TUint32 aIndexFrom, TUint32 aIndexTo, TBool aVal); + + void Invert(); + + TBool operator==(const RBitVector& aRhs) const; + TBool operator!=(const RBitVector& aRhs) const; + + //-- logical operations between 2 vectors. + void And(const RBitVector& aRhs); + void Or (const RBitVector& aRhs); + void Xor(const RBitVector& aRhs); + + TBool Diff(const RBitVector& aRhs, TUint32& aDiffIndex) const; + + TUint32 Num1Bits() const; + TUint32 Num1Bits(TUint32 aIndexFrom, TUint32 aIndexTo) const; + + TUint32 Num0Bits() const; + + + /** Bit search specifiers */ + enum TFindDirection + { + ELeft, ///< Search from the given position to the left (towards lower index) + ERight, ///< Search from the given position to the right (towards higher index) + ENearestL, ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the left + ENearestR ///< Search in both directions starting from the given position; in the case of the equal distances return the position to the right + + //-- N.B the current position the search starts with isn't included to the search. + }; + + TBool Find(TUint32& aStartPos, TBool aBitVal, TFindDirection aDir) const; + + /** panic codes */ + enum TPanicCode + { + EIndexOutOfRange, ///< index out of range + EWrondFindDirection, ///< a value doesn't belong to TFindDirection + ESizeMismatch, ///< Size mismatch for binary operators + ENotInitialised, ///< No memory allocated for the array + ENotImplemented, ///< functionality isn't implemented + + EDataAlignment, ///< wrong data alignment when importing / exporting raw data + }; + + protected: + + //-- these are outlawed. Can't use them because memory allocator can leave and we don't have conthrol on it in these methods. + RBitVector(const RBitVector& aRhs); + RBitVector& operator=(const RBitVector& aRhs); + + void* operator new(TUint); //-- disable creating objects on heap. + void* operator new(TUint, void*); + //------------------------------------- + + + void Panic(TPanicCode aPanicCode) const; + + inline TUint32 WordNum(TUint32 aBitPos) const; + inline TUint32 BitInWord(TUint32 aBitPos) const; + + protected: + //-- special interface to acecess raw internal data. It's protected. Derive appropriate class from this one if you wan to use it + void DoImportData(TUint32 aStartBit, TUint32 aNumBits, const TAny* apData); + void DoExportData(TUint32 aStartBit, TUint32 aNumBits, TDes8& aData) const; + + + private: + TBool FindToRight(TUint32& aStartPos, TBool aBitVal) const; + TBool FindToLeft (TUint32& aStartPos, TBool aBitVal) const; + TBool FindNearest(TUint32& aStartPos, TBool aBitVal, TBool aToLeft) const; + + inline TUint32 MaskLastWord(TUint32 aVal) const; + inline TBool ItrLeft(TUint32& aIdx) const; + inline TBool ItrRight(TUint32& aIdx) const; + + + protected: + + TUint32 iNumBits; ///< number of bits in the vector + TUint32* ipData; ///< pointer to the data + TUint32 iNumWords;///< number of 32-bit words that store bits + }; + + +//####################################################################################################################################### +//# inline functions area +//####################################################################################################################################### + + +//--------------------------------------------------------------------------------------------------------------------------------- +//-- class RBitVector + +/** @return size of the vector (number of bits) */ +inline TUint32 RBitVector::Size() const + { + return iNumBits; + } + +/** + Get a bit by index + + @param aIndex index in a bit vector + @return 0 if the bit at pos aIndex is 0, not zero otherwise + @panic EIndexOutOfRange if aIndex is out of range +*/ +inline TBool RBitVector::operator[](TUint32 aIndex) const + { + __ASSERT_ALWAYS(aIndex < iNumBits, Panic(EIndexOutOfRange)); + return (ipData[WordNum(aIndex)] & (1<> shift; //-- mask unused high bits + } + +inline TUint32 RBitVector::WordNum(TUint32 aBitPos) const + { + return aBitPos >> 5; + } + +inline TUint32 RBitVector::BitInWord(TUint32 aBitPos) const + { + return aBitPos & 0x1F; + } + + + +#endif //__FILESYSTEM_UTILS_BIT_VECTOR__ + + + + + + + + + + + + +