00001 #ifndef Quantity_H
00002 #define Quantity_H
00003
00004 #include <vector>
00005
00006 #include <libxml/tree.h>
00007
00008 #include <citrus/Dimension.H>
00009 #include <citrus/DimensionGroup.H>
00010 #include <citrus/Prefix.H>
00011 #include <citrus/Unit.H>
00012 #include <citrus/UnitPower.H>
00013
00014 #include <citrus/UnitExpr.H>
00015
00016 class Quantity {
00017 protected:
00019 double m_val ;
00021 vector<UnitPower> m_units ;
00023 vector<DimensionPower> m_dimn ;
00025 DimensionGroup* m_dgrp ;
00027 double m_scale ;
00028
00029 void Quantity::eval( UnitExpr* e,
00030 vector<UnitPower>& upwr,
00031 vector<DimensionPower>& dpwr,
00032 double& s ) ;
00033 void Quantity::p_eval( UnitExpr* e,
00034 int x,
00035 vector<UnitPower>& upwr,
00036 vector<DimensionPower>& dpwr,
00037 double& s ) ;
00038 friend class QUnitParser ;
00039 friend int convert( Quantity* to, const Quantity* from ) ;
00040
00041 public:
00042 Quantity() ;
00043 Quantity( const Quantity& qty ) ;
00044 Quantity( const char* dimNum ) ;
00045 Quantity( double v, UnitExpr* e ) ;
00046
00047 ~Quantity() ;
00048
00050 double val() const { return m_val ; }
00052 void val( double num ) { m_val = num ; }
00054 double scale() const { return m_scale ; }
00056 DimensionGroup* group() const { return m_dgrp ; }
00058 const vector<DimensionPower>& dimension() const { return m_dimn ; }
00062 vector<DimensionPower>& dimension() { return m_dimn ; }
00063 void print() ;
00064 xmlNodePtr mathML() const ;
00065
00066 bool operator == ( const Quantity& o ) const ;
00067 } ;
00068
00069 int convert( Quantity* to, const Quantity* from ) ;
00070
00071 #endif // Quantity_H