Advertisement
sebbu

siunits

Jul 27th, 2017
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.65 KB | None | 0 0
  1. #ifndef SIUNITS_HPP
  2. #define SIUNITS_HPP
  3.  
  4. #include <string>
  5. #include <iomanip>
  6. #include <iostream>
  7. #include <utility>
  8.  
  9. static const char* _length[2]={"","m"};
  10. static const char* _mass[2]={"","g"};
  11. static const char* _time[2]={"","s"};
  12. static const char* _current[2]={"","A"};
  13. static const char* _temperature[2]={"","C"};
  14. static const char* _substance[2]={"","mol"};
  15. static const char* _luminosity[2]={"","cd"};
  16.  
  17. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity,
  18. #ifdef EXTRA
  19. #endif
  20.     typename type
  21.     >
  22. class unit;
  23. /*
  24. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity,
  25. #ifdef EXTRA
  26. #endif
  27.     typename type,
  28.     int length2, int mass2, int time2, int current2, int temperature2, int substance2, int luminosity2>
  29.     unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type>
  30.     operator/(
  31.         const unit<length,mass,time,current,temperature,substance,luminosity,type>& v1,
  32.         const unit<length2,mass2,time2,current2,temperature2,substance2,luminosity2,type>& v2);//*/
  33.  
  34.  
  35. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity,
  36. #ifdef EXTRA
  37. #endif
  38.     typename type
  39.     >
  40. class unit
  41. {
  42. private:
  43.     unit& operator=(const type& v) { value=v.value; return (*this); }
  44.    
  45.     template<int length2, int mass2, int time2, int current2, int temperature2, int substance2, int luminosity2>
  46.     unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type>
  47.     operator/=(const unit<length2,mass2,time2,current2,temperature2,substance2,luminosity2,type>& v2);
  48.    
  49.     unit& operator*=(const unit& v);
  50.     //unit& operator/=(const unit& v);
  51. protected:
  52.     type value;
  53. public:
  54.     typedef unit<length,mass,time,current,temperature,substance,luminosity,type> ctype;//*/
  55.     unit():value(){}
  56.     unit(const type& v):value(v){}
  57.     unit(const unit& v):value(v.value){}
  58.     unit(const unit&& v):value(std::move(v.value)){}
  59.     ~unit(){}
  60.     const type& Value() const { return value; }
  61.     unit& operator=(const unit& v) { value=v.value; return (*this); }
  62.     unit& operator=(const unit&& v) { value=std::move(v.value); return (*this); }
  63.     unit& operator+=(const unit& v) { value+=v.value; return (*this); }
  64.     unit& operator-=(const unit& v) { value-=v.value; return (*this); }
  65.     unit& operator%=(const unit& v) { value%=v.value; return (*this); }
  66.     unit& operator*=(const type& v) { value*=v; return (*this); }
  67.     unit& operator/=(const type& v) { value/=v; return (*this); }
  68.     unit& operator%=(const type& v) { value%=v; return (*this); }
  69.     template<int length2, int mass2, int time2, int current2, int temperature2, int substance2, int luminosity2>
  70.     friend unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type>
  71.     operator/(
  72.         const unit<length,mass,time,current,temperature,substance,luminosity,type>& v1,
  73.         const unit<length2,mass2,time2,current2,temperature2,substance2,luminosity2,type>& v2)
  74.         {
  75.             unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type> v(v1.value/v2.Value());
  76.             return v;
  77.         }//*/
  78.     /*template<int length2, int mass2, int time2, int current2, int temperature2, int substance2, int luminosity2>
  79.     friend unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type>
  80.     operator/(
  81.         const unit<length2,mass2,time2,current2,temperature2,substance2,luminosity2,type>& v1,
  82.         const unit<length,mass,time,current,temperature,substance,luminosity,type>& v2)
  83.         {
  84.             unit<length-length2,mass-mass2,time-time2,current-current2,temperature-temperature2,substance-substance2,luminosity-luminosity2,type> v(v1.value()/v2.value());
  85.             return v;
  86.         }//*/
  87.     friend std::ostream& operator<<(std::ostream& o, const unit& v) {
  88.         o << v.value;
  89.        
  90.         o << _length[length!=0];
  91.         o << (length<0?"-":"");
  92.         if(length<0||length>1)
  93.             o << abs(length);
  94.        
  95.         o << _mass[mass!=0];
  96.         o << (mass<0?"-":"");
  97.         if(mass<0||mass>1)
  98.             o << abs(mass);
  99.        
  100.         o << _time[time!=0];
  101.         o << (time<0?"-":"");
  102.         if(time<0||time>1)
  103.             o << abs(time);
  104.        
  105.         return o; }
  106. };
  107.  
  108. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity, class type>
  109.     unit<length,mass,time,current,temperature,substance,luminosity,type>
  110.     operator+(
  111.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v1,
  112.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v2) {
  113.         unit<length,mass,time,current,temperature,substance,luminosity,type> v(v1); v+=v2; return v;
  114.     }
  115. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity, class type>
  116.     unit<length,mass,time,current,temperature,substance,luminosity,type>
  117.     operator-(
  118.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v1,
  119.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v2) {
  120.         unit<length,mass,time,current,temperature,substance,luminosity,type> v(v1); v-=v2; return v;
  121.     }
  122. template<int length, int mass, int time, int current, int temperature, int substance, int luminosity, class type>
  123.     unit<length,mass,time,current,temperature,substance,luminosity,type>
  124.     operator%(
  125.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v1,
  126.     const unit<length,mass,time,current,temperature,substance,luminosity,type>& v2) {
  127.         unit<length,mass,time,current,temperature,substance,luminosity,type>& v(v1); v%=v2; return v;
  128.     }
  129.  
  130.  
  131. #endif
  132. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement