Changeset 689

Show
Ignore:
Timestamp:
01/23/10 15:59:35 (2 years ago)
Author:
BCS
Message:

implemented switching to full 7 SI units
added version statement to demonstrate bug in DMD 2.039

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/units/si2.d

    r686 r689  
    1414import rational; 
    1515 
    16  
    17 template SI(int LengthN, int MassN, int TimeN, int TempN, int CurrentN, T = real) 
    18 
    19     alias SIB!(LengthN, 1, MassN, 1, TimeN, 1, TempN, 1, CurrentN, 1, T) SI; 
    20 
    21 template SI( 
    22             int LengthN,  int LengthD, 
    23             int MassN,    int MassD, 
    24             int TimeN,    int TimeD, 
    25             int TempN,    int TempD, 
    26             int CurrentN, int CurrentD, 
    27             T = real 
    28             ) 
    29 
    30     alias SIB!( LengthN, LengthD, MassN, MassD, TimeN, TimeD, TempN, TempD, CurrentN, CurrentD, T ) SI; 
    31 
    32  
    33 struct SIB( 
    34             int LengthN,  int LengthD, 
    35             int MassN,    int MassD, 
    36             int TimeN,    int TimeD, 
    37             int TempN,    int TempD, 
    38             int CurrentN, int CurrentD, 
    39             U 
    40             ) 
    41 
    42     // sanity check 
    43     static assert (Reduce!(LengthN,  LengthD).Reduced, "Length must be in reduced form"); 
    44     static assert (Reduce!(MassN,    MassD).Reduced,   "Mass must be in reduced form"); 
    45     static assert (Reduce!(TimeN,    TimeD).Reduced,   "Time must be in reduced form"); 
    46     static assert (Reduce!(TempN,    TempD).Reduced,   "Temp must be in reduced form"); 
    47     static assert (Reduce!(CurrentN, CurrentD).Reduced,"Current must be in reduced form"); 
    48  
    49     /// visible units 
    50     enum LenN = LengthN,  LenD = LengthD; 
    51     enum MasN = MassN,    MasD = MassD;     /// 
    52     enum TimN = TimeN,    TimD = TimeD;     /// 
    53     enum TmpN = TempN,    TmpD = TempD;     /// 
    54     enum CurN = CurrentN, CurD = CurrentD;  /// 
     16version(FullSI) 
     17
     18    template SI(int LengthN, int MassN, int TimeN, int TempN, int CurrentN, int MoleN, int LumiN, T = real) 
     19    { 
     20        alias SIB!(LengthN, 1, MassN, 1, TimeN, 1, TempN, 1, CurrentN, 1, MoleN, 1, LumiN, 1, T) SI; 
     21    } 
     22    template SI( 
     23                int LengthN,  int LengthD, 
     24                int MassN,    int MassD, 
     25                int TimeN,    int TimeD, 
     26                int TempN,    int TempD, 
     27                int CurrentN, int CurrentD, 
     28                int MoleN,    int MoleD, 
     29                int LuminN,   int LuminD, 
     30                T = real 
     31                ) 
     32    { 
     33        alias SIB!( LengthN, LengthD, MassN, MassD, TimeN, TimeD, TempN, TempD, CurrentN, CurrentD, MoleN, MoleD, LuminN, LuminD, T ) SI; 
     34    } 
     35
     36else 
     37
     38    template Batch( 
     39                int LengthN,  int LengthD, 
     40                int MassN,    int MassD, 
     41                int TimeN,    int TimeD, 
     42                int TempN,    int TempD, 
     43                int CurrentN, int CurrentD 
     44                ) 
     45    { 
     46        // sanity check 
     47        static assert (Reduce!(LengthN,  LengthD).Reduced, "Length must be in reduced form"); 
     48        static assert (Reduce!(MassN,    MassD).Reduced,   "Mass must be in reduced form"); 
     49        static assert (Reduce!(TimeN,    TimeD).Reduced,   "Time must be in reduced form"); 
     50        static assert (Reduce!(TempN,    TempD).Reduced,   "Temp must be in reduced form"); 
     51        static assert (Reduce!(CurrentN, CurrentD).Reduced,"Current must be in reduced form"); 
     52 
     53        /// visable units 
     54        enum LenN = LengthN,  LenD = LengthD; 
     55        enum MasN = MassN,    MasD = MassD;     /// 
     56        enum TimN = TimeN,    TimD = TimeD;     /// 
     57        enum TmpN = TempN,    TmpD = TempD;     /// 
     58        enum CurN = CurrentN, CurD = CurrentD;  /// 
     59    } 
     60 
     61    template SI(int LengthN, int MassN, int TimeN, int TempN, int CurrentN, T = real) 
     62    { 
     63        alias SIB!(Batch!( 
     64                /// visable units 
     65                LengthN,  1, 
     66                MassN,    1, 
     67                TimeN,    1, 
     68                TempN,    1, 
     69                CurrentN, 1 
     70                ), T ) SI; 
     71    } 
     72    template SI( 
     73                int LengthN,  int LengthD, 
     74                int MassN,    int MassD, 
     75                int TimeN,    int TimeD, 
     76                int TempN,    int TempD, 
     77                int CurrentN, int CurrentD, 
     78                T = real 
     79                ) 
     80    { 
     81 
     82        alias SIB!(Batch!( 
     83                /// visable units 
     84                LengthN,  LengthD, 
     85                MassN,    MassD, 
     86                TimeN,    TimeD, 
     87                TempN,    TempD, 
     88                CurrentN, CurrentD 
     89                ), T ) SI; 
     90    } 
     91
     92struct SIB(alias Exp_, U) 
     93
     94 
     95    alias Exp_ Exp; 
     96 
    5597 
    5698    // generate a usable name string 
    57     static if(LenD == 1) private enum sLen = LenN.stringof; else private enum sLen = LenN.stringof~"/"~LenD.stringof; 
    58     static if(MasD == 1) private enum sMas = MasN.stringof; else private enum sMas = MasN.stringof~"/"~MasD.stringof; 
    59     static if(TimD == 1) private enum sTim = TimN.stringof; else private enum sTim = TimN.stringof~"/"~TimD.stringof; 
    60     static if(TmpD == 1) private enum sTmp = TmpN.stringof; else private enum sTmp = TmpN.stringof~"/"~TmpD.stringof; 
    61     static if(CurD == 1) private enum sCur = CurN.stringof; else private enum sCur = CurN.stringof~"/"~CurD.stringof; 
     99    static if(Exp.LenD == 1) private enum sLen = Exp.LenN.stringof; else private enum sLen = Exp.LenN.stringof~"/"~Exp.LenD.stringof; 
     100    static if(Exp.MasD == 1) private enum sMas = Exp.MasN.stringof; else private enum sMas = Exp.MasN.stringof~"/"~Exp.MasD.stringof; 
     101    static if(Exp.TimD == 1) private enum sTim = Exp.TimN.stringof; else private enum sTim = Exp.TimN.stringof~"/"~Exp.TimD.stringof; 
     102    static if(Exp.TmpD == 1) private enum sTmp = Exp.TmpN.stringof; else private enum sTmp = Exp.TmpN.stringof~"/"~Exp.TmpD.stringof; 
     103    static if(Exp.CurD == 1) private enum sCur = Exp.CurN.stringof; else private enum sCur = Exp.CurN.stringof~"/"~Exp.CurD.stringof; 
    62104    /// The type name 
    63105    public enum Stringof = "SI!("~sLen~","~sMas~","~sTim~","~sTmp~","~sCur~","~U.stringof~")"; 
     
    69111    private alias SIB This; 
    70112 
    71     // check to make sure it's right! 
    72     static assert(is(SIB!(LengthN, LengthD, MassN, MassD, TimeN, TimeD, TempN, TempD, CurrentN, CurrentD,U) == This)); 
     113    // check to make shure it's right! 
     114    static assert(is(SIB!(Exp,U) == This)); 
    73115 
    74116    template Using(V) 
    75117    { 
    76         alias SIB!(LengthN, LengthD, MassN, MassD, TimeN, TimeD, TempN, TempD, CurrentN, CurrentD,V) Using; 
    77     } 
     118        alias SIB!(Exp,V) Using; 
     119    } 
     120 
    78121    template Alike(V) 
    79122    { 
     123        version(BUG) 
     124        { 
    80125        enum bool Alike =  
    81126            LenN == V.LenN && LenD == V.LenD && 
     
    84129            TmpN == V.TmpN && TmpD == V.TmpD && 
    85130            CurN == V.CurN && CurD == V.CurD; 
    86     } 
    87  
    88 //  template Match(T)   {           } 
     131        } 
     132        else 
     133        { 
     134        enum bool Alike =  
     135            Exp.LenN == V.Exp.LenN && Exp.LenD == V.Exp.LenD && 
     136            Exp.MasN == V.Exp.MasN && Exp.MasD == V.Exp.MasD && 
     137            Exp.TimN == V.Exp.TimN && Exp.TimD == V.Exp.TimD && 
     138            Exp.TmpN == V.Exp.TmpN && Exp.TmpD == V.Exp.TmpD && 
     139            Exp.CurN == V.Exp.CurN && Exp.CurD == V.Exp.CurD; 
     140        } 
     141    } 
     142 
    89143 
    90144    /// find the type of "This * T" 
     
    94148            alias This Mul; 
    95149        else 
    96             alias SIB! 
    97                     ( 
    98                         Reduce!(LengthN *T.LenD + LengthD *T.LenN, LengthD *T.LenD).V, 
    99                         Reduce!(MassN   *T.MasD + MassD   *T.MasN, MassD   *T.MasD).V, 
    100                         Reduce!(TimeN   *T.TimD + TimeD   *T.TimN, TimeD   *T.TimD).V, 
    101                         Reduce!(TempN   *T.TmpD + TempD   *T.TmpN, TempD   *T.TmpD).V, 
    102                         Reduce!(CurrentN*T.CurD + CurrentD*T.CurN, CurrentD*T.CurD).V, 
     150            alias SIB!(Batch!( 
     151                        Reduce!(Exp.LenN*T.Exp.LenD + Exp.LenD*T.Exp.LenN, Exp.LenD*T.Exp.LenD).V, 
     152                        Reduce!(Exp.MasN*T.Exp.MasD + Exp.MasD*T.Exp.MasN, Exp.MasD*T.Exp.MasD).V, 
     153                        Reduce!(Exp.TimN*T.Exp.TimD + Exp.TimD*T.Exp.TimN, Exp.TimD*T.Exp.TimD).V, 
     154                        Reduce!(Exp.TmpN*T.Exp.TmpD + Exp.TmpD*T.Exp.TmpN, Exp.TmpD*T.Exp.TmpD).V, 
     155                        Reduce!(Exp.CurN*T.Exp.CurD + Exp.CurD*T.Exp.CurN, Exp.CurD*T.Exp.CurD).V), 
    103156                        U 
    104157                    ) Mul; 
     
    111164            alias This Div; 
    112165        else 
    113             alias SIB! 
    114                     ( 
    115                         Reduce!(LengthN *T.LenD - LengthD *T.LenN, LengthD *T.LenD).V, 
    116                         Reduce!(MassN   *T.MasD - MassD   *T.MasN, MassD   *T.MasD).V, 
    117                         Reduce!(TimeN   *T.TimD - TimeD   *T.TimN, TimeD   *T.TimD).V, 
    118                         Reduce!(TempN   *T.TmpD - TempD   *T.TmpN, TempD   *T.TmpD).V, 
    119                         Reduce!(CurrentN*T.CurD - CurrentD*T.CurN, CurrentD*T.CurD).V, 
     166            alias SIB!(Batch!( 
     167                        Reduce!(Exp.LenN*T.Exp.LenD - Exp.LenD*T.Exp.LenN, Exp.LenD*T.Exp.LenD).V, 
     168                        Reduce!(Exp.MasN*T.Exp.MasD - Exp.MasD*T.Exp.MasN, Exp.MasD*T.Exp.MasD).V, 
     169                        Reduce!(Exp.TimN*T.Exp.TimD - Exp.TimD*T.Exp.TimN, Exp.TimD*T.Exp.TimD).V, 
     170                        Reduce!(Exp.TmpN*T.Exp.TmpD - Exp.TmpD*T.Exp.TmpN, Exp.TmpD*T.Exp.TmpD).V, 
     171                        Reduce!(Exp.CurN*T.Exp.CurD - Exp.CurD*T.Exp.CurN, Exp.CurD*T.Exp.CurD).V), 
    120172                        U 
    121173                    ) Div; 
     
    125177    static public template RootT(int i) 
    126178    { 
    127         alias SIB!( 
    128             Reduce!(LenN, LenD*i).V, 
    129             Reduce!(MasN, MasD*i).V, 
    130             Reduce!(TimN, TimD*i).V, 
    131             Reduce!(TmpN, TmpD*i).V, 
    132             Reduce!(CurN, CurD*i).V, 
     179        alias SIB!(Batch!( 
     180            Reduce!(Exp.LenN, Exp.LenD*i).V, 
     181            Reduce!(Exp.MasN, Exp.MasD*i).V, 
     182            Reduce!(Exp.TimN, Exp.TimD*i).V, 
     183            Reduce!(Exp.TmpN, Exp.TmpD*i).V, 
     184            Reduce!(Exp.CurN, Exp.CurD*i).V 
     185            ), 
    133186            U) RootT; 
    134187    } 
     
    137190    public template Power(int i) 
    138191    { 
    139         alias SIB!( 
    140             Reduce!(LenN*i, LenD).V, 
    141             Reduce!(MasN*i, MasD).V, 
    142             Reduce!(TimN*i, TimD).V, 
    143             Reduce!(TmpN*i, TmpD).V, 
    144             Reduce!(CurN*i, CurD).V, 
     192        alias SIB!(Batch!( 
     193            Reduce!(Exp.LenN*i, Exp.LenD).V, 
     194            Reduce!(Exp.MasN*i, Exp.MasD).V, 
     195            Reduce!(Exp.TimN*i, Exp.TimD).V, 
     196            Reduce!(Exp.TmpN*i, Exp.TmpD).V, 
     197            Reduce!(Exp.CurN*i, Exp.CurD).V 
     198            ), 
    145199            U) Power; 
    146200    } 
     
    183237    auto opDiv_r(U that) { return Power!(-1)(that / this.value); }  /// 
    184238 
    185     static if(LengthN == 0 && MassN == 0 && TimeN == 0 && TempN == 0 && CurrentN == 0) 
     239    static if(Exp.LenN == 0 && Exp.MasN == 0 && Exp.TimN == 0 && Exp.TmpN == 0 && Exp.CurN == 0) 
    186240        alias value this; 
    187241    else