Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.53 KB | None | 0 0
  1. /**
  2. ISQpp.h
  3. ISQpp
  4.  
  5. @date 07/27/2015
  6. @version 1.1
  7. */
  8.  
  9. #ifndef ISQPP_H
  10. #define ISQPP_H
  11.  
  12. #include <cmath>
  13. #include <limits>
  14.  
  15. namespace si
  16. {
  17.  
  18.  
  19.     /*exponent tables*/
  20.     //base units                  l,m,t,c,T,a,i
  21. #define ISQ_baseMetaArgs_LENG 1,0,0,0,0,0,0 //length
  22. #define ISQ_baseMetaArgs_MASS 0,1,0,0,0,0,0 //mass
  23. #define ISQ_baseMetaArgs_TIME 0,0,1,0,0,0,0 //time
  24. #define ISQ_baseMetaArgs_CURR 0,0,0,1,0,0,0 //current
  25. #define ISQ_baseMetaArgs_TEMP 0,0,0,0,1,0,0 //temperature
  26. #define ISQ_baseMetaArgs_AMTS 0,0,0,0,0,1,0 //amount of substance
  27. #define ISQ_baseMetaArgs_INTS 0,0,0,0,0,0,1 //intensity
  28.  
  29.     //derived units
  30. #define ISQ_baseMetaArgs_AREA 2,0,0,0,0,0,0 //area
  31. #define ISQ_baseMetaArgs_VOLM 3,0,0,0,0,0,0 //volume
  32. #define ISQ_baseMetaArgs_VELO 1,0,-1,0,0,0,0 //velocity
  33. #define ISQ_baseMetaArgs_ACCL 1,0,-2,0,0,0,0 //acceleration
  34. #define ISQ_baseMetaArgs_JOLT 1,0,-3,0,0,0,0 //jolt
  35. #define ISQ_baseMetaArgs_ANGV 0,0,-1,0,0,0,0 //angular velocity
  36. #define ISQ_baseMetaArgs_MOMT 1,1,-1,0,0,0,0 //momentum
  37. #define ISQ_baseMetaArgs_ANGM 2,1,-1,0,0,0,0 //angular momentum
  38. #define ISQ_baseMetaArgs_TORQ 2,1,-2,0,0,0,0 //torque
  39. #define ISQ_baseMetaArgs_ARDN -2,1,0,0,0,0,0 //area density
  40. #define ISQ_baseMetaArgs_DENS -3,1,0,0,0,0,0 //density
  41. #define ISQ_baseMetaArgs_SVOL 3,-1,0,0,0,0,0 //specific volume
  42.  
  43. #define ISQ_baseMetaArgs_HCAP 2,1,-2,0,-1,0,0 //heat capacity
  44. #define ISQ_baseMetaArgs_MHCP 2,1,-2,0,-1,-1,0 //molar heat capacity
  45. #define ISQ_baseMetaArgs_SHCP 2,0,-2,0,-1,0,0 //specific heat capacity
  46.  
  47. #define ISQ_baseMetaArgs_SENG 2,0,-2,0,0,0,0 //specific energy
  48. #define ISQ_baseMetaArgs_ENDN -1,1,-2,0,0,0,0 //energy density
  49. #define ISQ_baseMetaArgs_STNS 0,1,-2,0,0,0,0 //surface tension
  50. #define ISQ_baseMetaArgs_HFLX 0,1,-3,0,0,0,0 //heat flux
  51. #define ISQ_baseMetaArgs_TCON 1,1,-3,0,-1,0,0 //thermal conductivity
  52. #define ISQ_baseMetaArgs_KVIS 2,0,-1,0,0,0,0 //kinematic viscosity
  53. #define ISQ_baseMetaArgs_DVIS -1,1,-1,0,0,0,0 //dynamic viscosity
  54.  
  55. #define ISQ_baseMetaArgs_HRTZ 0,0,-1,0,0,0,0 //frequency
  56. #define ISQ_baseMetaArgs_WLEN 1,0,0,0,0,0,0 //wavelength
  57. #define ISQ_baseMetaArgs_WNUM -1,0,0,0,0,0,0 //wavenumber
  58. #define ISQ_baseMetaArgs_FORC 1,1,-2,0,0,0,0 //force
  59. #define ISQ_baseMetaArgs_IMPU 1,1,-1,0,0,0,0 //impulse
  60. #define ISQ_baseMetaArgs_PRES -1,1,-2,0,0,0,0 //pressure
  61. #define ISQ_baseMetaArgs_ENRG 2,1,-2,0,0,0,0 //energy
  62. #define ISQ_baseMetaArgs_WORK 2,1,-2,0,0,0,0 //work
  63. #define ISQ_baseMetaArgs_POWR 2,1,-3,0,0,0,0 //power
  64. #define ISQ_baseMetaArgs_CHRG 0,0,1,1,0,0,0 //charge
  65. #define ISQ_baseMetaArgs_VOLT 2,1,-3,-1,0,0,0 //voltage
  66. #define ISQ_baseMetaArgs_ECAP -1,-1,4,2,0,0,0 //electrical capacitance
  67. #define ISQ_baseMetaArgs_ERES 2,1,-3,-2,0,0,0 //electrical resistance
  68. #define ISQ_baseMetaArgs_ECON -2,-1,3,-1,0,0,0 //electrical conductivity
  69. #define ISQ_baseMetaArgs_MFLX 2,1,-2,-1,0,0,0 //magnetic flux
  70. #define ISQ_baseMetaArgs_INDC 2,1,-2,-2,0,0,0 //
  71. #define ISQ_baseMetaArgs_LFLX 0,0,0,0,0,0,1 //luminous flux
  72. #define ISQ_baseMetaArgs_ILLM -2,0,0,0,0,0,1 //luminance
  73. #define ISQ_baseMetaArgs_RDAC 0,0,-1,0,0,0,0 //radioactivity
  74. #define ISQ_baseMetaArgs_RDAD 2,0,-2,0,0,0,0 //absorbed radioactive dose
  75. #define ISQ_baseMetaArgs_RDED 2,0,-2,0,0,0,0 //equivalent radioactive dose
  76. #define ISQ_baseMetaArgs_CATA 0,0,-1,0,0,1,0 //catalytic activity
  77.  
  78. #define ISQ_baseMetaArgs_GENR 0,0,0,0,0,0,0 //dimensionless generic
  79. #define ISQ_baseMetaArgs_DLES 0,0,0,0,0,0,0 //dimensionless scalar
  80.  
  81.     //template argument lists
  82. #define ISQ_metaArgsMultiplication \
  83. le+LE, ma+MA, ti+TI, cu+CU, te+TE, am+AM, in+IN
  84.  
  85. #define ISQ_metaArgsDivision \
  86. le-LE, ma-MA, ti-TI, cu-CU, te-TE, am-AM, in-IN
  87.  
  88. #define ISQ_metaArgsComboList \
  89. le, LE, ma, MA, ti, TI, cu, CU, te, TE, am, AM, in, IN
  90.  
  91. #define ISQ_metaArgsList \
  92. le, ma, ti, cu, te, am, in
  93.  
  94. #define ISQ_metaArgsSecondaryList \
  95. LE, MA, TI, CU, TE, AM, IN
  96.  
  97. #define ISQ_metaArgsComboDefinition \
  98. int le, int ma, int ti, int cu, int te, int am, int in, int LE, int MA, int TI, int CU, int TE, int AM, int IN
  99.  
  100. #define ISQ_metaArgsDefinition \
  101. int le, int ma, int ti, int cu, int te, int am, int in
  102.  
  103. #define ISQ_metaArgsSecondaryDefinition \
  104. int LE, int MA, int TI, int CU, int TE, int AM, int IN
  105.  
  106.     namespace isq_internal
  107.     {
  108.         struct generic_scalar{};
  109.  
  110.         template<typename T_dim> class impl_vector2;
  111.         template<typename T_dim> class impl_vector3;
  112.         template<typename T_dim> class impl_vectorP;
  113.     }
  114.  
  115.     template <ISQ_metaArgsDefinition>
  116.     struct isq_base0;
  117.  
  118.     template <ISQ_metaArgsDefinition>
  119.     const isq_base0<ISQ_metaArgsList>
  120.         operator+(const isq_base0<ISQ_metaArgsList>&);
  121.  
  122.     template <ISQ_metaArgsDefinition>
  123.     const isq_base0<ISQ_metaArgsList>
  124.         operator-(const isq_base0<ISQ_metaArgsList>&);
  125.  
  126.  
  127.     template <ISQ_metaArgsDefinition>
  128.     struct isq_base0 : isq_internal::generic_scalar
  129.     {
  130.         isq_base0(double _in = 0.0) :value(_in){}
  131.  
  132.         template<ISQ_metaArgsSecondaryDefinition>
  133.         isq_base0(isq_base0<ISQ_metaArgsSecondaryList> _in) : value(_in.value){}
  134.  
  135.         //operator int() const { return (int)value; }
  136.         //operator float() const { return (float)value; }
  137.         operator double() const { return value; }
  138.  
  139.         /// euclidean distance constructor
  140.         isq_base0(const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  141.             const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs);
  142.  
  143.         /// operator+=(isq_base0, isq_base0)
  144.         isq_base0& operator+=(const isq_base0 rhs){
  145.             value += rhs.value;
  146.             return *this;
  147.         }
  148.         /// operator-=(isq_base0, isq_base0)
  149.         isq_base0& operator-=(const isq_base0 rhs){
  150.             value -= rhs.value;
  151.             return *this;
  152.         }
  153.  
  154.         double value;
  155.     };
  156.  
  157.     /// euclidean distance constructor
  158.     template<ISQ_metaArgsDefinition>
  159.     isq_base0<ISQ_metaArgsList>::isq_base0(
  160.         const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  161.         const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  162.         isq_base0<ISQ_metaArgsList> d1 = (rhs.x - lhs.x);
  163.         isq_base0<ISQ_metaArgsList> d2 = (rhs.y - lhs.y);
  164.         value = std::sqrt((d1.value*d1.value) + (d2.value*d2.value));
  165.     }
  166.  
  167.     /// operator+(isq_base0, isq_base0)
  168.     template
  169.         <ISQ_metaArgsDefinition>
  170.         const isq_base0<ISQ_metaArgsList>
  171.         operator+(const isq_base0<ISQ_metaArgsList>& lhs,
  172.         const isq_base0<ISQ_metaArgsList>& rhs)
  173.     {
  174.         return isq_base0<ISQ_metaArgsList>(lhs) += rhs;
  175.     }
  176.  
  177.     /// operator-(isq_base0, isq_base0)
  178.     template
  179.         <ISQ_metaArgsDefinition>
  180.         const isq_base0<ISQ_metaArgsList>
  181.         operator-(const isq_base0<ISQ_metaArgsList>& lhs,
  182.         const isq_base0<ISQ_metaArgsList>& rhs)
  183.     {
  184.         return isq_base0<ISQ_metaArgsList>(lhs) -= rhs;
  185.     }
  186.  
  187.     /// operator*(isq_base0, isq_base0)
  188.     template
  189.         <ISQ_metaArgsComboDefinition>
  190.         isq_base0<ISQ_metaArgsMultiplication>
  191.         operator*(const isq_base0<ISQ_metaArgsList>& lhs,
  192.         const isq_base0<ISQ_metaArgsSecondaryList>& rhs)
  193.     {
  194.         return isq_base0<ISQ_metaArgsMultiplication>
  195.             (lhs.value*rhs.value);
  196.     }
  197.  
  198.     /// operator*(double, isq_base0)
  199.     template
  200.         <ISQ_metaArgsDefinition>
  201.         isq_base0<ISQ_metaArgsList>
  202.         operator*(const double& lhs, const isq_base0<ISQ_metaArgsList>& rhs)
  203.     {
  204.         return isq_base0<ISQ_metaArgsList>
  205.             (lhs*rhs.value);
  206.     }
  207.  
  208.     /// operator/(isq_base0, isq_base0)
  209.     template
  210.         <ISQ_metaArgsComboDefinition>
  211.         isq_base0<ISQ_metaArgsDivision>
  212.         operator/(const isq_base0<ISQ_metaArgsList>& lhs,
  213.         const isq_base0<ISQ_metaArgsSecondaryList>& rhs)
  214.     {
  215.         return isq_base0<ISQ_metaArgsDivision>
  216.             (lhs.value / rhs.value);
  217.     }
  218.  
  219.     /// operator==(isq_base0, isq_base0)
  220.     template
  221.         <ISQ_metaArgsDefinition>
  222.         bool operator==(const isq_base0<ISQ_metaArgsList>& lhs,
  223.         const isq_base0<ISQ_metaArgsList>& rhs)
  224.     {
  225.         return std::fabs(lhs - rhs) < std::numeric_limits<double>::epsilon();
  226.     }
  227.  
  228.     /// operator!=(isq_base0, isq_base0)
  229.     template
  230.         <ISQ_metaArgsDefinition>
  231.         bool operator!=(const isq_base0<ISQ_metaArgsList>& lhs,
  232.         const isq_base0<ISQ_metaArgsList>& rhs)
  233.     {
  234.         return !(std::fabs(lhs - rhs) < std::numeric_limits<double>::epsilon());
  235.     }
  236.  
  237.     /// operator<=(isq_base0, isq_base0)
  238.     template
  239.         <ISQ_metaArgsDefinition>
  240.         bool
  241.         operator<=(const isq_base0<ISQ_metaArgsList>& lhs,
  242.         const isq_base0<ISQ_metaArgsList>& rhs)
  243.     {
  244.         return (lhs.value < rhs.value) || (std::fabs(lhs - rhs) < std::numeric_limits<double>::epsilon());
  245.     }
  246.  
  247.     /// operator>=(isq_base0, isq_base0)
  248.     template
  249.         <ISQ_metaArgsDefinition>
  250.         bool
  251.         operator>=(const isq_base0<ISQ_metaArgsList>& lhs,
  252.         const isq_base0<ISQ_metaArgsList>& rhs)
  253.     {
  254.         return (lhs.value > rhs.value) || (std::fabs(lhs - rhs) < std::numeric_limits<double>::epsilon());
  255.     }
  256.  
  257.     /// operator<(isq_base0, isq_base0)
  258.     template
  259.         <ISQ_metaArgsDefinition>
  260.         bool
  261.         operator<(const isq_base0<ISQ_metaArgsList>& lhs,
  262.         const isq_base0<ISQ_metaArgsList>& rhs)
  263.     {
  264.         return lhs.value < rhs.value;
  265.     }
  266.  
  267.     /// operator>(isq_base0, isq_base0)
  268.     template
  269.         <ISQ_metaArgsDefinition>
  270.         bool
  271.         operator>(const isq_base0<ISQ_metaArgsList>& lhs,
  272.         const isq_base0<ISQ_metaArgsList>& rhs)
  273.     {
  274.         return lhs.value > rhs.value;
  275.     }
  276.  
  277.     ///base units
  278.     typedef isq_base0<ISQ_baseMetaArgs_LENG> length;
  279.     typedef isq_base0<ISQ_baseMetaArgs_MASS> mass;
  280.     typedef isq_base0<ISQ_baseMetaArgs_TIME> time;
  281.     typedef isq_base0<ISQ_baseMetaArgs_CURR> current;
  282.     typedef isq_base0<ISQ_baseMetaArgs_TEMP> temperature;
  283.     typedef isq_base0<ISQ_baseMetaArgs_AMTS> amount;
  284.     typedef isq_base0<ISQ_baseMetaArgs_INTS> intensity;
  285.  
  286.     ///derived units
  287.     typedef isq_base0<ISQ_baseMetaArgs_DLES> angle; //radians
  288.     typedef isq_base0<ISQ_baseMetaArgs_AREA> area;
  289.     typedef isq_base0<ISQ_baseMetaArgs_VOLM> volume;
  290.     typedef isq_base0<ISQ_baseMetaArgs_VELO> velocity;
  291.     typedef isq_base0<ISQ_baseMetaArgs_ACCL> acceleration;
  292.     typedef isq_base0<ISQ_baseMetaArgs_JOLT> jolt;
  293.     typedef isq_base0<ISQ_baseMetaArgs_ANGV> angular_velocity;
  294.     typedef isq_base0<ISQ_baseMetaArgs_MOMT> momentum;
  295.     typedef isq_base0<ISQ_baseMetaArgs_ANGM> angular_momentum;
  296.     typedef isq_base0<ISQ_baseMetaArgs_TORQ> torque;
  297.     typedef isq_base0<ISQ_baseMetaArgs_ARDN> area_density;
  298.     typedef isq_base0<ISQ_baseMetaArgs_DENS> density;
  299.     typedef isq_base0<ISQ_baseMetaArgs_SVOL> specific_volume;
  300.     typedef isq_base0<ISQ_baseMetaArgs_HCAP> heat_capacity;
  301.     typedef isq_base0<ISQ_baseMetaArgs_MHCP> molar_heat_capacity;
  302.     typedef isq_base0<ISQ_baseMetaArgs_SHCP> specific_heat_capacity;
  303.     typedef isq_base0<ISQ_baseMetaArgs_SENG> specific_energy;
  304.     typedef isq_base0<ISQ_baseMetaArgs_ENDN> energy_density;
  305.     typedef isq_base0<ISQ_baseMetaArgs_STNS> surface_tension;
  306.     typedef isq_base0<ISQ_baseMetaArgs_HFLX> heatflux;
  307.     typedef isq_base0<ISQ_baseMetaArgs_TCON> thermal_conductivity;
  308.     typedef isq_base0<ISQ_baseMetaArgs_KVIS> kinetic_viscosity;
  309.     typedef isq_base0<ISQ_baseMetaArgs_DVIS> dynamic_viscosity;
  310.     typedef isq_base0<ISQ_baseMetaArgs_HRTZ> frequency;
  311.     typedef isq_base0<ISQ_baseMetaArgs_WLEN> wavelength;
  312.     typedef isq_base0<ISQ_baseMetaArgs_WNUM> wavenumber;
  313.     typedef isq_base0<ISQ_baseMetaArgs_FORC> force;
  314.     typedef isq_base0<ISQ_baseMetaArgs_IMPU> impulse;
  315.     typedef isq_base0<ISQ_baseMetaArgs_PRES> pressure;
  316.     typedef isq_base0<ISQ_baseMetaArgs_ENRG> energy;
  317.     typedef isq_base0<ISQ_baseMetaArgs_WORK> work;
  318.     typedef isq_base0<ISQ_baseMetaArgs_POWR> power;
  319.     typedef isq_base0<ISQ_baseMetaArgs_CHRG> charge;
  320.     typedef isq_base0<ISQ_baseMetaArgs_VOLT> voltage;
  321.     typedef isq_base0<ISQ_baseMetaArgs_ECAP> capacitance;
  322.     typedef isq_base0<ISQ_baseMetaArgs_ERES> resistance;
  323.     typedef isq_base0<ISQ_baseMetaArgs_ECON> conductivity;
  324.     typedef isq_base0<ISQ_baseMetaArgs_MFLX> magneticflux;
  325.     typedef isq_base0<ISQ_baseMetaArgs_LFLX> luminousflux;
  326.     typedef isq_base0<ISQ_baseMetaArgs_ILLM> illuminance;
  327.     typedef isq_base0<ISQ_baseMetaArgs_RDAC> radioactivity;
  328.     typedef isq_base0<ISQ_baseMetaArgs_RDAD> absorbed_rad_dose;
  329.     typedef isq_base0<ISQ_baseMetaArgs_RDED> equivalent_rad_dose;
  330.     typedef isq_base0<ISQ_baseMetaArgs_CATA> catalytic_activity;
  331.  
  332.     typedef isq_base0<ISQ_baseMetaArgs_DLES> dimensionless;
  333.  
  334.  
  335.     namespace isq_internal
  336.     {
  337.         /***********/
  338.         /**VECTOR2**/
  339.         /***********/
  340.         template<typename T_dim>
  341.         class impl_vector2
  342.         {
  343.         public:
  344.             impl_vector2(T_dim _x = 0, T_dim _y = 0) : x(_x), y(_y){};
  345.             impl_vector2<T_dim> operator=(const impl_vector2<T_dim> rhs){
  346.                 this->x = rhs.x;
  347.                 this->y = rhs.y;
  348.                 return *this;
  349.             };
  350.  
  351.             operator impl_vectorP<T_dim>() const{
  352.                 T_dim M = std::sqrt((x*x) + (y*y));
  353.                 si::angle th = atan2(x, y);
  354.                 return impl_vectorP<T_dim>(M, th);
  355.             }
  356.  
  357.             T_dim x;
  358.             T_dim y;
  359.         };
  360.  
  361.         /**ADDITION**/
  362.         template<ISQ_metaArgsDefinition>
  363.         inline impl_vector2<isq_base0<ISQ_metaArgsList>>
  364.             operator+(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs, const impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  365.             return impl_vector2<isq_base0<ISQ_metaArgsList>>(lhs.x + rhs.x, lhs.y + rhs.y);
  366.         }
  367.         template<ISQ_metaArgsDefinition>
  368.         inline void operator+=(impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs, const impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  369.             lhs = (lhs + rhs);
  370.         }
  371.  
  372.         /**SUBTRACTION**/
  373.         template<ISQ_metaArgsDefinition>
  374.         inline impl_vector2<isq_base0<ISQ_metaArgsList>>
  375.             operator-(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  376.             const impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  377.             return impl_vector2<isq_base0<ISQ_metaArgsList>>(lhs.x - rhs.x, lhs.y - rhs.y);
  378.         }
  379.         template<ISQ_metaArgsDefinition>
  380.         inline void operator-=(impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs, const impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  381.             lhs = (lhs - rhs);
  382.         }
  383.  
  384.         /**DIVISION**/
  385.         //operator/(vector2, vector2)
  386.         template<ISQ_metaArgsComboDefinition>
  387.         inline impl_vector2<isq_base0<ISQ_metaArgsDivision>>
  388.             operator/(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  389.             const impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>& rhs){
  390.             return impl_vector2<isq_base0<ISQ_metaArgsDivision>>(lhs.x / rhs.x, lhs.y / rhs.y);
  391.         }
  392.         //operator/(vector2, scalar) [dimensional]
  393.         template<ISQ_metaArgsComboDefinition>
  394.         inline impl_vector2<isq_base0<ISQ_metaArgsDivision>>
  395.             operator/(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  396.             const isq_base0<ISQ_metaArgsSecondaryList>& rhs){
  397.             return impl_vector2<isq_base0<ISQ_metaArgsDivision>>(lhs.x / rhs, lhs.y / rhs);
  398.         }
  399.         //operator/(scalar, vector2)
  400.         template<ISQ_metaArgsComboDefinition>
  401.         inline impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>
  402.             operator/(const isq_base0<ISQ_metaArgsList>& lhs,
  403.             const impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>& rhs){
  404.             return impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>(lhs / rhs.x, lhs / rhs.y);
  405.         }
  406.         //operator/=(anonymous, anonymous)
  407.         template<typename T_d1, typename T_d2>
  408.         inline void operator/=(T_d1& lhs, const T_d2 rhs){
  409.             lhs = (lhs / rhs);
  410.         }
  411.  
  412.         /**MULTIPLICATION**/
  413.         //operator*(vector2, vector2)
  414.         template<ISQ_metaArgsComboDefinition>
  415.         inline impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>
  416.             operator*(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  417.             const impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>& rhs){
  418.             return impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>(lhs.x*rhs.x, lhs.y*rhs.y);
  419.         }
  420.         //operator*(vector2, scalar)
  421.         template<ISQ_metaArgsComboDefinition>
  422.         inline impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>
  423.             operator*(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  424.             const isq_base0<ISQ_metaArgsSecondaryList>& rhs){
  425.             return impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>(lhs.x*rhs, lhs.y*rhs);
  426.         }
  427.         //operator*(scalar, vector2)
  428.         template<ISQ_metaArgsComboDefinition>
  429.         inline impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>
  430.             operator*(const isq_base0<ISQ_metaArgsList>& lhs,
  431.             const impl_vector2<isq_base0<ISQ_metaArgsSecondaryList>>& rhs){
  432.             return impl_vector2<isq_base0<ISQ_metaArgsMultiplication>>(lhs*rhs.x, lhs*rhs.y);
  433.         }
  434.         //operator*(vector2, double)
  435.         template<ISQ_metaArgsDefinition>
  436.         inline impl_vector2<isq_base0<ISQ_metaArgsList>>
  437.             operator*(const impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs, const double& rhs){
  438.             return impl_vector2<isq_base0<ISQ_metaArgsList>>(lhs.x.value*rhs, lhs.y.value*rhs);
  439.         }
  440.         //operator*=(anonymous, anonymous)
  441.         template<typename T_d1, typename T_d2>
  442.         inline void operator*=(T_d1& lhs, const T_d2& rhs){
  443.             lhs = (lhs * rhs);
  444.         }
  445.  
  446.         /**COMPARISON**/
  447.         //operator==(isq_base0, isq_base0)
  448.         template<ISQ_metaArgsDefinition>
  449.         bool
  450.             operator==(const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& lhs,
  451.             const isq_internal::impl_vector2<isq_base0<ISQ_metaArgsList>>& rhs){
  452.             if (!(std::fabs(lhs.x.value - rhs.x.value) < std::numeric_limits<double>::epsilon())) return false;
  453.             if (!(std::fabs(lhs.y.value - rhs.y.value) < std::numeric_limits<double>::epsilon())) return false;
  454.             return true;
  455.         }
  456.  
  457.         /***********/
  458.         /**VECTOR3**/
  459.         /***********/
  460.         template<typename T_dim>
  461.         class impl_vector3
  462.         {
  463.             impl_vector3(T_dim _x = 0, T_dim _y = 0, T_dim _z = 0) : x(_x), y(_y), z(_z){};
  464.             impl_vector3<T_dim> operator=(const impl_vector3<T_dim> rhs){
  465.                 this->x = rhs.x;
  466.                 this->y = rhs.y;
  467.                 this->z = rhs.z;
  468.                 return *this;
  469.             };
  470.  
  471.             T_dim x;
  472.             T_dim y;
  473.             T_dim z;
  474.         };
  475.  
  476.         /***********/
  477.         /**VECTORP**/
  478.         /***********/
  479.         template<typename T_dim>
  480.         class impl_vectorP
  481.         {
  482.         public:
  483.             impl_vectorP(T_dim _m, si::angle _th) : m(_m), th(_th){};
  484.             T_dim m;
  485.             si::angle th;
  486.  
  487.             operator impl_vector2<T_dim>() const{
  488.                 T_dim x = m * std::cos(th);
  489.                 T_dim y = m * std::sin(th);
  490.                 return impl_vector2<T_dim>(x, y);
  491.             }
  492.         };
  493.     }
  494.  
  495.     namespace vec
  496.     {
  497.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_VELO>> velocity;
  498.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_ACCL>> acceleration;
  499.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_LENG>> position;
  500.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_LENG>> displacement;
  501.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_FORC>> force;
  502.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_MOMT>> momentum;
  503.         typedef isq_internal::impl_vector2<isq_base0<ISQ_baseMetaArgs_JOLT>> jolt;
  504.     }
  505.  
  506.     namespace vec3
  507.     {
  508.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_VELO>> velocity;
  509.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_ACCL>> acceleration;
  510.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_LENG>> position;
  511.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_LENG>> displacement;
  512.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_FORC>> force;
  513.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_MOMT>> momentum;
  514.         typedef isq_internal::impl_vector3<isq_base0<ISQ_baseMetaArgs_JOLT>> jolt;
  515.     }
  516.  
  517.     namespace pvec
  518.     {
  519.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_VELO>> velocity;
  520.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_ACCL>> acceleration;
  521.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_LENG>> position;
  522.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_LENG>> displacement;
  523.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_FORC>> force;
  524.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_MOMT>> momentum;
  525.         typedef isq_internal::impl_vectorP<isq_base0<ISQ_baseMetaArgs_JOLT>> jolt;
  526.     }
  527.  
  528.     /*namespace nodim
  529.     {
  530.         typedef isq_base0<ISQ_baseMetaArgs_DLES> reynolds;
  531.     }*/
  532.  
  533. #undef ISQ_baseMetaArgs_LENG
  534. #undef ISQ_baseMetaArgs_MASS
  535. #undef ISQ_baseMetaArgs_TIME
  536. #undef ISQ_baseMetaArgs_CURR
  537. #undef ISQ_baseMetaArgs_TEMP
  538. #undef ISQ_baseMetaArgs_AMTS
  539. #undef ISQ_baseMetaArgs_INTS
  540. #undef ISQ_baseMetaArgs_AREA
  541. #undef ISQ_baseMetaArgs_VOLM
  542. #undef ISQ_baseMetaArgs_VELO
  543. #undef ISQ_baseMetaArgs_ACCL
  544. #undef ISQ_baseMetaArgs_JOLT
  545. #undef ISQ_baseMetaArgs_ANGV
  546. #undef ISQ_baseMetaArgs_MOMT
  547. #undef ISQ_baseMetaArgs_ANGM
  548. #undef ISQ_baseMetaArgs_TORQ
  549. #undef ISQ_baseMetaArgs_ARDN
  550. #undef ISQ_baseMetaArgs_DENS
  551. #undef ISQ_baseMetaArgs_SVOL
  552. #undef ISQ_baseMetaArgs_HCAP
  553. #undef ISQ_baseMetaArgs_MHCP
  554. #undef ISQ_baseMetaArgs_SHCP
  555. #undef ISQ_baseMetaArgs_SENG
  556. #undef ISQ_baseMetaArgs_ENDN
  557. #undef ISQ_baseMetaArgs_STNS
  558. #undef ISQ_baseMetaArgs_HFLX
  559. #undef ISQ_baseMetaArgs_TCON
  560. #undef ISQ_baseMetaArgs_KVIS
  561. #undef ISQ_baseMetaArgs_DVIS
  562. #undef ISQ_baseMetaArgs_HRTZ
  563. #undef ISQ_baseMetaArgs_FORC
  564. #undef ISQ_baseMetaArgs_PRES
  565. #undef ISQ_baseMetaArgs_ENRG
  566. #undef ISQ_baseMetaArgs_POWR
  567. #undef ISQ_baseMetaArgs_CHRG
  568. #undef ISQ_baseMetaArgs_VOLT
  569. #undef ISQ_baseMetaArgs_ECAP
  570. #undef ISQ_baseMetaArgs_ERES
  571. #undef ISQ_baseMetaArgs_ECON
  572. #undef ISQ_baseMetaArgs_MFLX
  573. #undef ISQ_baseMetaArgs_INDC
  574. #undef ISQ_baseMetaArgs_LFLX
  575. #undef ISQ_baseMetaArgs_ILLM
  576. #undef ISQ_baseMetaArgs_RDAC
  577. #undef ISQ_baseMetaArgs_RDAD
  578. #undef ISQ_baseMetaArgs_RDED
  579. #undef ISQ_baseMetaArgs_CATA
  580. #undef ISQ_baseMetaArgs_GENR
  581.  
  582.  
  583. }// namespace si
  584. #endif // ISQPP_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement