1class Varbit(object):
2	__slots__ = ('data', 'bits')
3
4	def from_bits(subtype, bits, data):
5		if bits == 1:
6			return (data[0] & (1 << 7)) and OneBit or ZeroBit
7		else:
8			rob = object.__new__(subtype)
9			rob.bits = bits
10			rob.data = data
11			return rob
12	from_bits = classmethod(from_bits)
13
14	def __new__(typ, data):
15		if isinstance(data, Varbit):
16			return data
17		if isinstance(data, bytes):
18			return typ.from_bits(len(data) * 8, data)
19		# str(), eg '00101100'
20		bits = len(data)
21		nbytes, remain = divmod(bits, 8)
22		bdata = [bytes((int(data[x:x+8], 2),)) for x in range(0, bits - remain, 8)]
23		if remain != 0:
24			bdata.append(bytes((int(data[nbytes*8:].ljust(8,'0'), 2),)))
25		return typ.from_bits(bits, b''.join(bdata))
26
27	def __str__(self):
28		if self.bits:
29			# cut off the remainder from the bits
30			blocks = [bin(x)[2:].rjust(8, '0') for x in self.data]
31			blocks[-1] = blocks[-1][0:(self.bits % 8) or 8]
32			return ''.join(blocks)
33		else:
34			return ''
35
36	def __repr__(self):
37		return '%s.%s(%r)' %(
38			type(self).__module__,
39			type(self).__name__,
40			str(self)
41		)
42
43	def __eq__(self, ob):
44		if not isinstance(ob, type(self)):
45			ob = type(self)(ob)
46		return ob.bits == self.bits and ob.data == self.data
47
48	def __len__(self):
49		return self.bits
50
51	def __add__(self, ob):
52		return Varbit(str(self) + str(ob))
53
54	def __mul__(self, ob):
55		return Varbit(str(self) * ob)
56
57	def getbit(self, bitoffset):
58		if bitoffset < 0:
59			idx = self.bits + bitoffset
60		else:
61			idx = bitoffset
62		if not 0 <= idx < self.bits:
63			raise IndexError("bit index %d out of range" %(bitoffset,))
64
65		byte, bitofbyte = divmod(idx, 8)
66		if ord(self.data[byte]) & (1 << (7 - bitofbyte)):
67			return OneBit
68		else:
69			return ZeroBit
70
71	def __getitem__(self, item):
72		if isinstance(item, slice):
73			return type(self)(str(self)[item])
74		else:
75			return self.getbit(item)
76
77	def __nonzero__(self):
78		for x in self.data:
79			if x != 0:
80				return True
81		return False
82
83class Bit(Varbit):
84	def __new__(subtype, ob):
85		if ob is ZeroBit or ob is False or ob == '0':
86			return ZeroBit
87		elif ob is OneBit or ob is True or ob == '1':
88			return OneBit
89
90		raise ValueError('unknown bit value %r, 0 or 1' %(ob,))
91
92	def __nonzero__(self):
93		return self is OneBit
94
95	def __str__(self):
96		return self is OneBit and '1' or '0'
97
98ZeroBit = object.__new__(Bit)
99ZeroBit.data = b'\x00'
100ZeroBit.bits = 1
101OneBit = object.__new__(Bit)
102OneBit.data = b'\x80'
103OneBit.bits = 1
104