#ifndef NibStr_h
#define NibStr_h

#include <Str.h>

class BIstream;
class BOstream;

class NibStr : public Str {

protected:

	bool	even;	// true => length % 2 == 0 

public:

	inline NibStr(void) : Str(), even(true) {};
	inline NibStr(int nibs) : Str((nibs+1)>>1), even((nibs & 1)? false : true) { };
	inline NibStr(const NibStr & rv) : Str(rv), even(rv.even) {};
	inline NibStr(unsigned long long value, int nibs) : Str((nibs+1)>>1),
										even((nibs & 1)? false : true) {
		poke (0, value, nibs);
	};
	inline ~NibStr(void) {};
	
	inline const NibStr & operator= (const NibStr & rv) {
		Str::operator= (rv);
		even = rv.even;
		return *this;
	}; 
	
	inline unsigned long length(void) const {
		unsigned long tmp = len * 2;
		return (even)? tmp : tmp - 1;
	};
	
	void poke (unsigned long offset, unsigned long long val, int nibs);
	unsigned long long peek( unsigned long offset, int nibs) const ;
	
	NibStr operator+ (const NibStr & rv) const;
	
	NibStr operator+= (const NibStr & rv);

	void clear (void) {
		Str::clear();
		even = true;
	};

	void insert(unsigned long offset, const NibStr & replacement);

	friend BOstream & operator<< (BOstream & out, const NibStr & n);
	friend BIstream & operator>> (BIstream & in, NibStr & n);
};

BOstream & operator<< (BOstream & out, const NibStr & n);

BIstream & operator>> (BIstream & in, NibStr & n);

#endif /* NibStr_h */




syntax highlighted by Code2HTML, v. 0.9.1