The Fib multimedia system
Fib is a system for storing multimedia data (like images or films).
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
cFibMatrix.h
Go to the documentation of this file.
1 /**
2  * @class cFibMatrix
3  * file name: cFibMatrix.h
4  * @author Betti Oesterholz
5  * @date 02.01.2012
6  * @mail webmaster@BioKom.info
7  *
8  * System: C++
9  *
10  * This class represents the Fib matrix element.
11  * Copyright (C) @c LGPL3 2012 Betti Oesterholz
12  *
13  * This program is free software: you can redistribute it and/or modify
14  * it under the terms of the GNU Lesser General Public License (LGPL) as
15  * published by the Free Software Foundation, either version 3 of the
16  * License, or any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU Lesser General Public License for more details.
22  *
23  * You should have received a copy of the GNU Lesser General Public License
24  * along with this program. If not, see <http://www.gnu.org/licenses/>.
25  *
26  *
27  * This class represents the matrix element of the Fib multimedia language.
28  *
29  * An matrix element represents a d dimensional matrix. For every dimension
30  * ther is an area (Startvalue_h to Endvalue_h) for its possible index values.
31  * Furthermore ther is a list ( (W_{1.1}, ..., W_{i.1}), ... ,
32  * (W_{1.k}, ..., W_{i.k}) with vectors for the elements of the matrix.
33  *
34  * In the evaluation of the matrix element each dimension/counter/index
35  * variable (Variable_1, ..., Variable_d) goes through all integers of
36  * the corresponding area (Startvalue_h to Endvalue_h). For each integer
37  * value of the Variable_h all integer values of the variable Variable_{h-1}
38  * will be set. For each value allocation of the dimension variables
39  * (Variable_1, ... , Variable_d) the value variables (Variable_{d+1}, ... ,
40  * Variable_{d+i}) will be set to the next set of values (W_{1.b}, ... , W_{i.b}).
41  * This continues until either the dimension variables (Variable_1, ... ,
42  * Variable_d) have gone through all of their values or there is no next
43  * set of values (W_{1.k+1}, ... , W_{i.k+1}). If an element W_{a.b} is a
44  * variable, so the Variable_{d+a} will be assigned according to the value
45  * of the variable W_{a.b}.
46  *
47  * If there are no value variables (i=0), just all the values of the
48  * dimension variables (Variable_1, ..., Variable_d) will be set and the
49  * sets of values will be ignored.
50  *
51  */
52 /*
53 History:
54 02.01.2012 Oesterholz created
55 */
56 
57 #ifndef ___C_FIB_MATRIX_H__
58 #define ___C_FIB_MATRIX_H__
59 
60 
61 #include "version.h"
62 
63 #include "fibDatatyps.h"
64 
65 #include "cFibLimb.h"
66 #include "cRoot.h"
67 #include "cVectorFibMatrix.h"
68 #include "cVectorArea.h"
69 #include "cFibVariable.h"
70 
71 namespace fib{
72 
73 
74 class cFibMatrix: public cFibLimb{
75 
76 friend class cFibElement;
77 
78 private:
79 
80  /**
81  * The variables, which this matrix element defines.
82  */
83  vector< cFibVariable * > vecVariablesDefined;
84 
85  /**
86  * The vector with the area vectors for the dimensions of the matrix.
87  * The vector element i is for dimension i .
88  */
89  vector< cVectorArea * > vecMatrixDimensionAreas;
90 
91  /**
92  * The list with the vectors of the matrix element.
93  */
94  list< cVectorFibMatrix > liFibMatrix;
95 
96  /**
97  * The number of the matrix element domain for this matrix element.
98  */
100 
101 public:
102 
103  /**
104  * parameter constructor
105  *
106  * @param iuNumberOfDimensions the number of dimension (variables)
107  * (minimum is 1)
108  * @param iuNumberOfVectorElements the number of elements in the vectors
109  * of the elements of the matrix of this matrix element should have
110  * @param pInSubobject the Fib element which is the subobject of
111  * this Fib element (it also stands next in the order of Fib elements)
112  * @param pInSuperiorElement the Fib element in which this
113  * matrix element is a subobject
114  */
115  cFibMatrix( unsignedIntFib iuNumberOfDimensions,
116  const unsignedIntFib iuNumberOfVectorElements,
117  cFibElement * pInSubobject = NULL,
118  cFibElement * pInSuperiorElement = NULL );
119 
120  /**
121  * copyconstructor
122  * This copyconstructor constructs a copy of the given matrix element.
123  * It dosn't copy other Fib elements than the given, even if ther are
124  * in the matrix element.
125  *
126  * @param matrixElement the matrix element to copy
127  */
128  cFibMatrix( const cFibMatrix &matrixElement );
129 
130 protected:
131 
132  /**
133  * The constructor for restoring a matrix object from an TinyXml element.
134  *
135  * @param pXmlNode a pointer to the TinyXml node wher the Fib object is stored in
136  * @param outStatus An reference to an integervalue where the errorvalue
137  * can be stored to.
138  * possible errorvalues are:
139  * - 0 loading successful
140  * - -1 loading error, invalid pXmlElement
141  * - -2 loading error, invalid data in pXmlElement
142  * - 1 loading warning, invalid data in pXmlElement, error could be corrected
143  * - 2 loading warning, invalid data in pXmlElement, maybe the loaded
144  * object is wrong
145  * @param liDefinedVariables a list with the defined variables for the
146  * to restore Fib element, every variable should have it's number
147  * (the number under which it is stored) as it's value
148  */
149  cFibMatrix( const TiXmlElement * pXmlElement, intFib &outStatus,
150  list<cFibVariable*> & liDefinedVariables );
151 
152  /**
153  * This constructor restores a matrix object from the stream where it is
154  * stored in the compressed Fib format.
155  * This method is for internal use only.
156  *
157  * @param iBitStream the stream wher the matrix object is stored in,
158  * because this stream is an cReadBits, any number of bits can be
159  * readed from it
160  * @param outStatus An reference to an integer value where the error value
161  * can be stored to. If the pointer is NULL no error value will be
162  * given back.
163  * possible error values are:
164  * - 0 loading successful
165  * - -1 loading error, invalid stream
166  * - -2 loading error, invalid data in stream
167  * - 1 loading warning, invalid data in stream, error could be corrected
168  * - 2 loading warning, invalid data in stream, maybe the loaded
169  * object is wrong
170  * @param liDefinedVariables a list with the defined variables for the
171  * to restore Fib element, every variable should have it's number
172  * (the number under which it is stored) as it's value
173  * @param validDomains the domains valid for restoring the Fib elements
174  * @param pNextRoot the next higher root-element for the to restore
175  * Fib elements, or the last restored root-element
176  */
177  cFibMatrix( cReadBits & iBitStream, intFib & outStatus,
178  list<cFibVariable*> & liDefinedVariables, const cDomains & validDomains,
179  cRoot * pNextRoot );
180 
181 
182 public:
183 
184  /**
185  * destructor
186  */
187  virtual ~cFibMatrix();
188 
189  /**
190  * @see getTypeName
191  * @return a character for the typ of the Fib element
192  * Types are:
193  * - u: element of unknown typ
194  * - p: point
195  * - l: list-element
196  * - y: property
197  * - c: comment
198  * - a: area
199  * - f: function
200  * - i: if-condition
201  * - o: extern object element
202  * - s: extern subobject element
203  * - v: set-element
204  * - m: matrix element
205  * - r: root-element
206  */
207  virtual char getType() const;
208 
209  /**
210  * This method checks, if this Fib-element is an valid Fib-element.
211  *
212  * @return true if this Fib-element is an valid Fib-element, else false
213  */
214  virtual bool isValidFibElement() const;
215 
216  /**
217  * This method evaluades the Fib object.
218  *
219  * @param evaluePosition a reference to the object with the
220  * evaluePosition() method to evalue /store the positions and ther
221  * properties; everytime a point (to evalue) is reached in the
222  * evaluation, this method is called with the position and the
223  * properties of the point; @see iEvaluePosition
224  * @param objectPoint the object point in the order of true part objects
225  * to evalue
226  * @param liVecProperties a list with the property vectors which should
227  * be global for the evalued object
228  * @return if the evaluation was successfull true, else false
229  */
230  virtual bool evalueObject( iEvaluePosition & evaluePosition,
231  const unsignedIntFib objectPoint,
232  list<cVectorProperty> & liVecProperties ) const;
233 
234  /**
235  * This method evaluades the Fib object.
236  * Evertime a Fib elements, with a type of the given type chars in
237  * liCFibElementTyps, is reached while evaluation, it is given
238  * back with the properties which it has.
239  * Ever point element is given back. The type chars for point elements
240  * don't need to be in the list liCFibElementTyps.
241  *
242  * @param evalueFibElement a reference to the object with the
243  * evalueElement() method to evalue /store the Fib elements and ther
244  * properties; everytime a Fib element (with one of the type given
245  * in liCFibElementTyps) is reached in the evaluation, the method
246  * evalueElement() of this objects is called with the Fib element
247  * and the properties of the Fib element; @see iEvalueFibElement
248  * @param objectPoint the object point in the order of true part objects
249  * to evalue
250  * @param liVecProperties a list with the property vectors which should
251  * be global for the evalued object
252  * @param liCFibElementTyps a list with the type chars (@see getType)
253  * of the Fib elements to return
254  * @return if the evaluation was successfull true, else false
255  */
256  virtual bool evalueObject( iEvalueFibElement & evalueFibElement,
257  const unsignedIntFib objectPoint,
258  list<cVectorProperty> & liVecProperties,
259  const list<char> & liCFibElementTyps );
260 
261  /**
262  * This method evaluades a value for the time needed to evalue the
263  * object.
264  * This value should not exceed lMaxTime, if the value for the time
265  * is greater than lMaxTime the evaluation will be stopt and lMaxTime
266  * returned. If lMaxTime is 0 (for infinity) the evaluation won't be
267  * stoped, this is the standard case.
268  *
269  * @see evalueObject()
270  * @param lMaxTime the maximum time for the evaluation, the returned value
271  * will not be greater than this value; the value 0 stands for infinity,
272  * so the evaluation won't be stoped
273  * @return a value for the time needed to evalue the object
274  */
275  virtual unsignedLongFib getTimeNeed( unsignedLongFib lMaxTime=0 ) const;
276 
277  /**
278  * This method evaluades the size of the Fib object in bits in the
279  * compressed file form.
280  *
281  * @see store()
282  * @return the size of the Fib object in bits in the compressed form
283  */
284  virtual unsignedLongFib getCompressedSize() const;
285 
286  /**
287  * This method checks if the given variable is used in the given
288  * direction from this Fib element.
289  *
290  * @see cFibVariable
291  * @see isDefinedVariable()
292  * @param variable the variable to check if it is used
293  * @param direction the direction from this Fib element, in which the
294  * variable should be used; default value is ED_POSITION so yust
295  * this Fib element will be checked
296  * @return true if the variable is used, else false
297  */
298  virtual bool isUsedVariable( const cFibVariable *variable ,
299  edDirection direction=ED_POSITION ) const;
300 
301  /**
302  * This method returns all variables used in the given direction from
303  * this Fib element.
304  *
305  * @see cFibVariable
306  * @see isUsedVariable()
307  * @see isDefinedVariable()
308  * @param direction the direction from this Fib element, in which the
309  * variable should be used; default value is ED_POSITION so yust
310  * this Fib element will be checked
311  * @return the set with all variables used in the given direction from
312  * this Fib element
313  */
314  virtual set<cFibVariable*> getUsedVariables( edDirection direction=ED_POSITION );
315 
316  /**
317  * This method replace the variable pVariableOld with the variable
318  * pVariableNew in the object.
319  *
320  * @see cFibVariable
321  * @see isUsedVariable()
322  * @see isDefinedVariable()
323  * @param pVariableOld the variable to replace
324  * @param pVariableNew the variable with which the variable pVariableOld
325  * is to be replace
326  * @return true if the variable pVariableOld is replaced with pVariableNew,
327  * else false
328  */
329  virtual bool replaceVariable( cFibVariable * pVariableOld,
330  cFibVariable * pVariableNew );
331 
332  /**
333  * This method copies the Fib element on the specified position.
334  * Variables which are not defined in the Fib element but used
335  * don't change ther reference.
336  *
337  * @see getType()
338  * @param cType the type of the Fib element to copy
339  * @param elementPoint the number of the Fib element, in the order of
340  * Fib elements of the given type cType, to copy
341  * @param bAbsolute if the lNumber is an absolute value for the wool
342  * Fib object
343  * @return the copy of the Fib element
344  */
345  virtual cFibElement *copyElement( const char cType='u', const unsignedIntFib
346  elementPoint=0, bool bAbsolute=false ) const;
347 
348  /**
349  * This method stores this Fib object in the XML format into the
350  * given stream.
351  *
352  * @param stream the stream where this Fib object should be stored to
353  * @return true if this Fib object is stored, else false
354  */
355  virtual bool storeXml( ostream &stream ) const;
356 
357 
358 /*
359  * matrix element methods
360  */
361 
362 
363  /**
364  * @return the number of dimensions (variables) the matrix of this
365  * matrix element has
366  * @see vecMatrixDimensionAreas
367  */
369 
370  /**
371  * @return the number of elements of the matrix entry vectors of the
372  * matrix of this matrix element has
373  * @see liFibMatrix
374  */
376 
377  /**
378  * This method returns a pointer to the uiPosition'th from this
379  * matrix element defined variable.
380  *
381  * @param uiPosition the number of the from this matrix element defined
382  * variable to return (counting begins with 1)
383  * @return a pointer to the uiPosition'th from this matrix element defined
384  * variable, or NULL if non such exists
385  */
386  cFibVariable * getDefinedVariable( const unsignedLongFib uiPosition );
387 
388 
389  /**
390  * @see uiDomainNr
391  * @return the number of the matrix element domain for this matrix element
392  */
393  unsignedIntFib getDomainNr() const;
394 
395  /**
396  * This method sets the number of the matrix element domain for this
397  * matrix element.
398  *
399  * @see uiDomainNr
400  * @param uiInDomainNumber the number of the matrix element domain for
401  * this matrix element
402  */
403  void setDomainNr( const unsignedLongFib uiInDomainNumber );
404 
405  /**
406  * This method returns the area for the uiDimension'th dimension.
407  *
408  * @see vecMatrixDimensionAreas
409  * @param uiDimension the dimension for which the area is to be returned
410  * (counting begins with 1)
411  * @return the area for the uiDimension'th dimension
412  */
413  cVectorArea * getArea( const unsignedIntFib uiDimension=1 );
414 
415  /**
416  * @see liFibMatrix
417  * @return the number of vectors or sets of values this matrix element contains
418  */
420 
421  /**
422  * @return a vector with all vectors / sets of values of this matrix element
423  * @see liFibMatrix
424  */
425  const vector< cVectorFibMatrix > getVectors();
426 
427  /**
428  * This method sets all vectors / sets of values of this matrix element
429  * to the given vectors.
430  *
431  * @see liFibMatrix
432  * @param vecMatrixVectors a vector with all vectors / sets of values this
433  * matrix element should contain
434  * @return true if the vectors wher set, else false and the vectors of
435  * this matrix element unchanged
436  */
437  bool setVectors( const vector< cVectorFibMatrix > & vecMatrixVectors );
438 
439  /**
440  * This method returns a pointer to the uiPosition'th vector of this
441  * matrix element.
442  *
443  * @see liFibMatrix
444  * @param uiPosition the number of the vector to return (counting begins
445  * with 1)
446  * @return a pointer to the uiPosition'th vector, or NULL if non such exists
447  */
448  cVectorFibMatrix * getVector( const unsignedLongFib uiPosition );
449 
450  /**
451  * This method sets the uiPosition'th vector of this matrix element to
452  * the given vector.
453  *
454  * @see liFibMatrix
455  * @param vecMatrixVector the vector to set
456  * @param uiPosition the position wher the to matrix vector should stand
457  * in this matrix element (counting begins with 1)
458  * @return true if the vector wher set, else false and the vectors of
459  * this matrix element unchanged
460  */
461  bool setVector( const cVectorFibMatrix & vecMatrixVector,
462  const unsignedLongFib uiPosition );
463 
464  /**
465  * This method adds the given vector to the existing vectors.
466  *
467  * @see liSubFibMatrixs
468  * @param vecMatrixVector a reference to the to add vector
469  * @param uiPosition the position wher the vecMatrix should be added
470  * (counting begins with 1); if 0 the vecMatrix or greater than the number
471  * of vectors the vector will be added to the end of the vector list
472  * @return true if the vecMatrix was added, else false
473  */
474  bool addVector( const cVectorFibMatrix & vecMatrixVector,
475  const unsignedLongFib uiPosition=0 );
476 
477  /**
478  * This method deletes the uiPosition'th vector from the existing vectors.
479  *
480  * @param uiPosition the position, wher the vector should be deleted from
481  * (counting begins with 1)
482  * @return true if the vector was deleted, else false
483  */
484  bool deleteVector( const unsignedLongFib uiPosition );
485 
486 
487 protected:
488 
489  /**
490  * This method stores this Fib object in the compressed Fib-format
491  * into the given stream.
492  * It is needed because the stream can yust store byts but the size of
493  * Fib elements can be any number of bits. Because of that ther have to
494  * be a possibility to exchange the missing bits betwean the Fib elements.
495  *
496  * @see store
497  * @param stream the stream where this Fib object should be stored to
498  * @param cRestBits the not yet writen bits which should be stored
499  * @param uiRestBitPosition the number of bits in the cRestBits which
500  * should be writen respectively containing valid information
501  * @return true if this Fib object is stored, else false
502  */
503  virtual bool storeBit( ostream & stream, char & cRestBits,
504  unsigned char & uiRestBitPosition ) const;
505 
506  /**
507  * This method sets the each variable, which is defined above a leaf,
508  * to an uniqe integer number greater than the given number
509  * uiLastVariableNumber. While storing this number can be stored to
510  * identify the variable.
511  *
512  * @param uiLastVariableNumber the number which was last use, this
513  * means also is the greatest used, in this limb.
514  * @return the number which was last use, this
515  * means also is the greatest used, in this limb
516  * from the method
517  */
519  unsignedIntFib uiLastVariableNumber = 0 );
520 
521  /**
522  * This method copies the connected object with the given number in the
523  * order of connected objects.
524  * For this every Fib element, beginning from this Fib element, that
525  * is part of the connected object will be copied.
526  * Variables which are not defined in the connected object but used
527  * don't change ther reference.
528  * It is an help method for the copy method. It dosn't update the
529  * structural information of the created Fib object.
530  *
531  * @param iObjectPoint the number of the connected object to copy;
532  * the standartvalue is 0 for coping the complet actual object
533  * @return the copy of the connected object or NULL if non such exists
534  */
535  virtual cFibElement *copyInternal( const unsignedIntFib iObjectPoint=0 ) const;
536 
537  /**
538  * This method checks if the given variable is defined in the given
539  * direction from this Fib element.
540  * This is for intern use to get the correct data from
541  * isDefinedVariable() without pCallingFibElement.
542  *
543  * @see cFibVariable
544  * @see isUsedVariable()
545  * @param pVariable the variable to check if it is defined
546  * @param direction the direction from this Fib element, in which the
547  * variable should be defined; default value is ED_POSITION so yust
548  * this Fib element will be checked
549  * @param pCallingFibElement the Fib element which called this method
550  * @return true if the variable is used, else false
551  */
552  virtual bool isDefinedVariableInternal( const cFibVariable * pVariable,
553  edDirection direction = ED_POSITION,
554  const cFibElement * pCallingFibElement = NULL ) const;
555 
556  /**
557  * This method returns all variables defined in the given direction from
558  * this Fib element.
559  * This is for intern use to get the correct data from
560  * getDefinedVariables() without pCallingFibElement.
561  *
562  * @see cFibVariable
563  * @see getUsedVariables()
564  * @see isDefinedVariable()
565  * @param direction the direction from this Fib element, in which the
566  * variable should be used; default value is ED_POSITION so yust
567  * this Fib element will be checked
568  * @param pCallingFibElement the Fib element which called this method
569  * @return the matrix with all variables used in the given direction from
570  * this Fib element
571  */
572  virtual list< cFibVariable* > getDefinedVariablesInternal(
573  edDirection direction = ED_HIGHER,
574  const cFibElement * pCallingFibElement = NULL );
575 
576 
577  /**
578  * This method checks if the given Fib object is equal to this Fib
579  * object.
580  * Variables can be others, but must be defined and used in equivalent
581  * Fib elements.
582  *
583  * @param fibObject the Fib object to which this Fib object should be
584  * equal
585  * @param mapEqualRootObjects the root objects of this object that wher
586  * already checked as equal
587  * map entries:
588  * key: the root-element of this Fib object that was checked
589  * value: the to the key correspondending root-element of the
590  * fibObject that was checked and which is equal to the key
591  * root-element
592  * (it is empty if bCheckExternalObjects == false)
593  * @param mapEqualDefinedVariables the Fib elements that defines
594  * variables and are equal;
595  * map entries:
596  * key: the Fib element of this Fib object that was checked
597  * value: the to the key correspondending Fib element of the
598  * fibObject that was checked and which sets its defined
599  * variables to the same values as the key Fib element
600  * @param bCheckExternalObjects if true the external objects of
601  * cExtObject will be compared
602  * @return true if this Fib object is equal to the given Fib object,
603  * else false
604  */
605  virtual bool equalInternal( const cFibElement & fibObject,
606  map< const cRoot *, const cRoot * > & mapEqualRootObjects,
607  map< const cFibElement *, const cFibElement * > & mapEqualDefinedVariables,
608  const bool bCheckExternalObjects ) const;
609 
610  /**
611  * This method checks if the given Fib element is equal to this Fib
612  * element.
613  * The subobjects are not compared, not even ther count is compared.
614  * Used variables can be others.
615  *
616  * @param fibElement the Fib element to which this Fib element should be
617  * equal
618  * @param mapEqualRootObjects the root objects of this object that wher
619  * already checked as equal
620  * map entries:
621  * key: the root-element of this Fib object that was checked
622  * value: the to the key correspondending root-element of the
623  * fibObject that was checked and which is equal to the key
624  * root-element
625  * (it is empty if bCheckExternalObjects == false)
626  * @param mapEqualDefinedVariables the Fib elements that defines
627  * variables and are equal;
628  * map entries:
629  * key: the Fib element of this Fib object that was checked
630  * value: the to the key correspondending Fib element of the
631  * fibObject that was checked and which sets its defined
632  * variables to the same values as the key Fib element
633  * @param bCheckExternalObjects if true the external objects of
634  * cExtObject will be compared
635  * @return true if this Fib element is equal to the given Fib element,
636  * else false
637  */
638  virtual bool equalElementInternal( const cFibElement & fibElement,
639  map< const cRoot *, const cRoot * > & matrixEqualRootObjects,
640  map< const cFibElement *, const cFibElement * > & mapEqualDefinedVariables,
641  const bool bCheckExternalObjects ) const;
642 
643 
644  /**
645  * This method checks if the given Fib element sets the variable to
646  * the same values as this Fib element.
647  *
648  * @param pVariableOwn a pointer to a defined variable in this Fib element,
649  * it is compared to the equivalent variable pVariable in the given
650  * Fib element fibElement
651  * @param fibElement the Fib element, to which this Fib element should be
652  * compared
653  * @param pVariable a pointer to a defined variable in the other
654  * Fib element fibElement
655  * @param mapEqualRootObjects the root objects of this object that wher
656  * already checked as equal
657  * map entries:
658  * key: the root-element of this Fib object that was checked
659  * value: the to the key correspondending root-element of the
660  * fibObject that was checked and which is equal to the key
661  * root-element
662  * (it is empty if bCheckExternalObjects == false)
663  * @param mapEqualDefinedVariables the Fib elements that defines
664  * variables and are equal;
665  * map entries:
666  * key: the Fib element of this Fib object that was checked
667  * value: the to the key correspondending Fib element of the
668  * fibObject that was checked and which sets its defined
669  * variables to the same values as the key Fib element
670  * @param bCheckExternalObjects if true the external objects of
671  * cExtObject will be compared
672  * @return true if this Fib element sets the variable to the same
673  * values as this Fib element
674  */
675  virtual bool equalValuesSetInternal( const cFibVariable * pVariableOwn,
676  const cFibElement & fibElement,
677  const cFibVariable * pVariable,
678  map< const cRoot *, const cRoot * > & matrixEqualRootObjects,
679  map< const cFibElement *, const cFibElement * > & mapEqualDefinedVariables,
680  const bool bCheckExternalObjects ) const;
681 
682 
683 };
684 }//namespace fib
685 
686 #endif //___C_FIB_MATRIX_H__
687 
688 
689 
690 
691 
692