DSPython  00.03.03 — 25 juin 2012
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Pages
cnat32array.py
Aller à la documentation de ce fichier.
1 #!/usr/bin/env python
2 # -*- coding: latin-1 -*-
3 ##\package DSPython.cnat32array
4 # Tableau compact de naturels stockés sur n \htmlonly ≤\endhtmlonly 32 bits
5 # !!! Work in progress !!!
6 
7 ##\file
8 # Tableau compact de naturels stockés sur n \htmlonly ≤\endhtmlonly 32 bits
9 # !!! Work in progress !!!
10 
11 # (c) Olivier Pirson --- DragonSoft
12 # http://www.opimedia.be/DS/
13 # Débuté le 20 juillet 2006
14 ####################################
15 from __future__ import print_function
16 
17 ## Date du dernier changement pour ce module
18 VERSION = 'cnat32array --- 2010 March 16'
19 
20 import array
21 
22 import DSPython
23 import DSPython.nat32 as nat32
24 
25 
26 
27 # ########
28 # Classe #
29 ##########
30 ## Tableau compact de naturels stockés sur n bits.
32  """Tableau compact de naturels stockés sur n bits.
33  Les éléments sont stockés de façon contiguë en mémoire.
34  Par ex.: les éléments d'un tableau de 5 éléments sur 7 bits
35  occupe 35 bits arrondi à 2*32 == 64 bits
36 
37  Pre: n: 1 <= naturel <= 32"""
38 
39  ## Constucteur
40  def __init__(self, size, items=None):
41  """Renvoie un tableau compact de naturels stockés sur size bits.
42  Si items == None alors renvoie un tableau vide
43 
44  Pre: size: 1 <= naturel <= 32
45  items: None
46 
47  O() = ..."""
48  assert DSPython.natural_is(size), size
49  assert 1 <= size <= 32, size
50 
51  ## Taille maximale des éléments (en binaire) du tableau
52  self.size = size
53 
54  ## Nombre d'éléments contenu dans le tableau
55  self.len = 0
56 
57  ## Array d'éléments de 32 bits contenant les éléments du tableau
58  self.a = array.array('L')
59  if items != None:
60  raise NotImplementedError
61 
62 
63  ## self[key]
64  def __getitem__(self, key):
65  """Renvoie l'élément d'indice key
66  ou un tuple contenant les éléments de la tranche key.
67  Lève une exception IndexError si le ou les indices n'existent pas
68 
69  Pre: key: entier ou tranche
70 
71  Result: naturel < 2**32 ou tuple de naturels < 2**32
72 
73  O() = ..."""
74  assert DSPython.natural_is(key) or type(key) == types.SliceType, type(key)
75 
76  if type(key) != types.SliceType: # indice simple
77  if self.size == 32: # chaque élément correspond exactement à 1 élément du array
78  return int(self.tables[key])
79  else: # chaque élément est plus petit qu'1 élément du array
80  if key < 0:
81  key += self.len
82  if key < 0:
83  raise IndexError
84  elif key >= self.len:
85  raise IndexError
86 
87  key, shift = divmod(key * self.size, 32)
88  if self.size + shift <= 32: # l'élément tient sur 1 seul élément du array
89  return int((self.a[key] >> shift) & nat32.MERSENNE32_TUPLE[self.size])
90  else: # l'élément est partagé sur 2 éléments du array
91  return int(((long(self.a[key+1]) << (32 - shift))
92  | (self.a[key] >> shift))
93  & nat32.MERSENNE32_TUPLE[self.size])
94  else: # tranche d'indices
95  return (tuple(self[i] for i in range(key.start, key.stop)) if key.step == None
96  else tuple(self[i] for i in range(key.start, key.stop, key.step)))
97 
98 
99  ## Nombre d'éléments
100  def __len__(self):
101  """Renvoie le nombre d'éléments du tableau
102 
103  Result: naturel
104 
105  O() = 1"""
106  return self.len
107 
108 
109  ## Transforme en string
110  def __repr__(self):
111  """Si le tableau est vide alors renvoie 'Cnat32array()'
112  sinon renvoie 'Cnat32array(size, [éléments])'
113 
114  Result: string quotée
115 
116  O() = ..."""
117  return ('Cnat32array()' if self.len == 0
118  else 'Cnat32array({0}, {1!r})'.format(self.size, [n for n in self.a]))
119 
120 
121  ## self[key] = value
122  def __setitem__(self, key, value):
123  """Modifie le ou les éléments d'indice key par value.
124  Lève une exception IndexError si le ou les indices n'existent pas
125 
126  Pre: key: entier ou tranche
127 
128  O() = ..."""
129  if self.size == 32: # chaque élément correspond exactement à 1 élément du array
130  assert DSPython.natural_is(key) or type(key) == types.SliceType, type(key)
131 
132  self.a[key] = value
133  else: # chaque élément est plus petit qu'1 élément du array
134  raise NotImplementedError
135 
136 
137 
138 # ######\cond MAINTEST
139 # Main #
140 ########
141 if __name__ == '__main__':
142  def main_test():
143  """Test du module"""
144  import sys
145 
146  import DSPython.debug as debug
147 
148  debug.test_begin(VERSION, __debug__)
149 
150  print('Cnat32array()...', end=''); sys.stdout.flush()
151  for k in range(1, 33):
152  t = Cnat32array(k)
153  assert t.len == 0 == len(t) == 0, (t.len, len(t))
154  assert t.size == k, t.size
155  assert type(t.a) == array.array, type(t.a)
156  assert len(t.a) == 0, len(t.a)
157  assert repr(t) == 'Cnat32array()'
158  print('ok'); sys.stdout.flush()
159 
160  print('Cnat32array.__getitem__()...', end=''); sys.stdout.flush()
161  print('???', end='')
162  print('ok'); sys.stdout.flush()
163 
164 
165  print('Cnat32array.__len__()...', end=''); sys.stdout.flush()
166  print('???', end='')
167  print('ok'); sys.stdout.flush()
168 
169 
170  print('Cnat32array.__repr__()...', end=''); sys.stdout.flush()
171  print('???', end='')
172  print('ok'); sys.stdout.flush()
173 
174 
175  print('Cnat32array.__setitem__()...', end=''); sys.stdout.flush()
176  print('???', end='')
177  print('ok'); sys.stdout.flush()
178  debug.test_end()
179 
180  main_test()
181 ##\endcond MAINTEST