source: comparacioncriptosistemas/field_number.H @ 267b1a7

interfaz
Last change on this file since 267b1a7 was 1b57940, checked in by Alejandro <amujica@…>, 9 years ago

Primeros intentos

  • Property mode set to 100644
File size: 5.9 KB
Line 
1/*
2  Copyright (C) 2015
3  Alejandro Mujica (amujica en cenditel.gob.ve)
4  José Ángel Contreras (jancontreras en cenditel.gob.ve)
5  Antonio Araujo (aaraujo en cenditel.gob.ve)
6  Pedro Buitrago (pbuitrago en cenditel.gob.ve)
7 
8  CENDITEL Fundación Centro Nacional de Desarrollo e Investigación en
9  Tecnologías Libres
10 
11  Este programa es software libre; Usted puede usarlo bajo los términos de la
12  licencia de software GPL versión 2.0 de la Free Software Foundation.
13 
14  Este programa se distribuye con la esperanza de que sea útil, pero SIN
15  NINGUNA GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o
16  ADECUACIÓN A UN PROPÓSITO PARTICULAR.
17  Consulte la licencia GPL para más detalles. Usted debe recibir una copia
18  de la GPL junto con este programa; si no, escriba a la Free Software
19  Foundation Inc. 51 Franklin Street,5 Piso, Boston, MA 02110-1301, USA.
20*/
21
22/*
23  Este archivo contiene la definición e implementación de una clase tipo
24  plantilla para representar números enteros restringidos a un campo finito.
25
26  Creado por:        Alejandro J. Mujica
27  Fecha de creación:
28*/
29
30
31# ifndef FIELD_NUMBER_H
32# define FIELD_NUMBER_H
33
34# include <iostream>
35# include <typeinfo>
36
37/**
38 * Plantilla que representa un número restringido a un campo.
39 *
40 * @param Number_Type tipo numérico que se va a restringir. Debe ser un tipo
41 *                    de los enteros de la biblioteca estándar de C++.
42 *
43 * @param Field       Tipo de campo a utilizar. El campo debe manejar el mismo
44 *                    tipo de número que se usa en esta plantilla.
45 *
46 * @see               Field.
47 *
48 * @author Alejandro J. Mujica (amujica en cenditel punto gob punto ve).
49 */
50template <typename Number_Type, class Field_Type>
51class Field_Number
52{
53  static_assert(std::is_integral<Number_Type>::value,
54                "first template argument must be an integral type");
55
56  static_assert(std::is_same<Number_Type, typename Field_Type::number_t>::value,
57  "first template argument in Field_Number is not the same type template\
58 argument in Field");
59
60public:
61  /// Tipo de campo que restringe al número.
62  typedef          Field_Type        field_t; 
63  /// Tipo de número restringido.
64  typedef typename field_t::number_t number_t;
65
66private:
67  field_t  field;
68
69  number_t value;
70
71public:
72  /// Constructor que funge de paramétrico y por omisión.
73  Field_Number(const number_t & _value = number_t(0));
74
75  Field_Number operator + (const Field_Number &);
76
77  Field_Number & operator += (const Field_Number &);
78
79  Field_Number operator - (const Field_Number &);
80
81  Field_Number & operator -= (const Field_Number &);
82
83  Field_Number operator * (const Field_Number &);
84
85  Field_Number & operator *= (const Field_Number &);
86
87  Field_Number operator / (const Field_Number &);
88
89  Field_Number & operator /= (const Field_Number &);
90
91  bool operator == (const Field_Number &) const;
92
93  bool operator != (const Field_Number &) const;
94
95  bool operator ! () const;
96
97  friend std::ostream & operator << (std::ostream & out,
98                                     const Field_Number & fn)
99  {
100    out << (number_t) fn.value;
101    return out;
102  }
103
104  Field_Number & operator ++ () const;
105
106  Field_Number & operator -- () const;
107
108  /// Operador de casting para el tipo numérico base.
109  operator number_t & ()
110  {
111    return value;
112  }
113};
114
115template <typename Number_Type, class Field>
116Field_Number<Number_Type, Field>::Field_Number(const number_t & _value)
117  : field(), value(field(_value))
118{
119  // Empty
120}
121
122template <typename Number_Type, class Field> Field_Number<Number_Type, Field>
123Field_Number<Number_Type, Field>::operator + (const Field_Number & fn)
124{
125  Field_Number ret;
126  ret.value = field.sum(value, fn.value);
127  return ret;
128}
129
130template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
131Field_Number<Number_Type, Field>::operator += (const Field_Number & fn)
132{
133  *this = *this + fn;
134  return *this;
135}
136
137template <typename Number_Type, class Field> Field_Number<Number_Type, Field>
138Field_Number<Number_Type, Field>::operator - (const Field_Number & fn)
139{
140  Field_Number ret;
141  ret.value = field.sub(value, fn.value);
142  return ret;
143}
144
145template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
146Field_Number<Number_Type, Field>::operator -= (const Field_Number & fn)
147{
148  *this = *this - fn;
149  return *this;
150}
151
152template <typename Number_Type, class Field> Field_Number<Number_Type, Field>
153Field_Number<Number_Type, Field>::operator * (const Field_Number & fn)
154
155{
156  Field_Number ret;
157  ret.value = field.mul(value, fn.value);
158  return ret;
159}
160
161template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
162Field_Number<Number_Type, Field>::operator *= (const Field_Number & fn)
163{
164  *this = *this * fn;
165  return *this;
166}
167
168template <typename Number_Type, class Field> Field_Number<Number_Type, Field>
169Field_Number<Number_Type, Field>::operator / (const Field_Number & fn)
170{
171  Field_Number ret;
172  ret.value = field.div(value, fn.value);
173  return ret;
174}
175
176template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
177Field_Number<Number_Type, Field>::operator /= (const Field_Number & fn)
178{
179  *this = *this / fn;
180  return *this;
181}
182
183template <typename Number_Type, class Field> bool
184Field_Number<Number_Type, Field>::operator == (const Field_Number & fn) const
185{
186  return value == fn.value;
187}
188
189template <typename Number_Type, class Field> bool
190Field_Number<Number_Type, Field>::operator != (const Field_Number & fn) const
191{
192  return not (*this == fn);
193}
194
195template <typename Number_Type, class Field>
196bool Field_Number<Number_Type, Field>::operator ! () const
197{
198  return value == number_t(0);
199}
200
201template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
202Field_Number<Number_Type, Field>::operator ++ () const
203{
204  ++value;
205  return *this;
206}
207
208template <typename Number_Type, class Field> Field_Number<Number_Type, Field> &
209Field_Number<Number_Type, Field>::operator -- () const
210{
211  --value;
212  return *this;
213}
214
215# endif // FIELD_NUMBER_H
216
Note: See TracBrowser for help on using the repository browser.