00001 #ifndef UnitInfo_H
00002 #define UnitInfo_H
00003
00004 #include <stdio.h>
00005
00006 #include "Dimension.H"
00007 #include "DimensionGroup.H"
00008 #include "Prefix.H"
00009 #include "Unit.H"
00010
00012 class UnitInfo {
00013 public:
00014 virtual ~UnitInfo() { } ;
00015 virtual int type() const = 0 ;
00016 virtual UnitInfo* copy() const = 0 ;
00017 virtual void print(FILE* f) const = 0 ;
00018 enum {
00019 UNIT=1,
00020 OPER=2
00021 } ;
00022 } ;
00023
00025 class UnitUnitInfo : public UnitInfo {
00026 protected:
00027 Unit* m_u ;
00028 Prefix* m_p ;
00029 int m_x ;
00030 friend class Quantity ;
00031 public:
00032 UnitUnitInfo( Unit* u, Prefix* p, int x )
00033 { m_p = p ;
00034 m_x = x ;
00035 if ( u )
00036 m_u = u ;
00037 else
00038 m_u = Unit::find("none") ;
00039 } ;
00040 virtual ~UnitUnitInfo() { }
00041
00042 Unit* unit() { return m_u ; } ;
00043 Prefix* prefix() { return m_p ; } ;
00044 int exp() const { return m_x ; } ;
00045 void exp(int x) { m_x = x ; } ;
00046
00047 virtual UnitInfo* copy() const { return new UnitUnitInfo( m_u, m_p, m_x ) ; }
00048 virtual int type() const { return UNIT ; } ;
00049 virtual void print(FILE* f) const
00050 {
00051 if (!m_x) return ;
00052 if (m_p) fprintf( f, "%s", m_p->abbr() ) ;
00053 fprintf( f, "%s", m_u->abbr() ) ;
00054 if (m_x != 1) fprintf( f, "^%d", m_x ) ;
00055 } ;
00056 } ;
00057
00059 class UnitOperInfo : public UnitInfo {
00060 protected:
00061 char m_op ;
00062 friend class Quantity ;
00063 public:
00064 UnitOperInfo( char op )
00065 : m_op(op) { } ;
00066 virtual ~UnitOperInfo() { }
00067
00068 char op() const { return m_op ; } ;
00069
00070 virtual UnitInfo* copy() const { return new UnitOperInfo( m_op ) ; }
00071 virtual int type() const { return OPER ; } ;
00072 virtual void print(FILE* f) const
00073 { fprintf( f, "%c", m_op ) ; } ;
00074 } ;
00075
00076
00077
00078 #endif // UnitInfo_H