pastebin - collaborative debugging tool
rovema.kpaste.net RSS


prototype rov_int_template<> 20250127-001
Posted by Anonymous on Mon 27th Jan 2025 15:16
raw | new post

  1. /*
  2.  * MIT License
  3.  *
  4.  * Copyright (c) 2025 Roland Mainz <roland.mainz@nrubsig.org>
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  7.  * of this software and associated documentation files (the "Software"), to deal
  8.  * in the Software without restriction, including without limitation the rights
  9.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10.  * copies of the Software, and to permit persons to whom the Software is
  11.  * furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included in all
  14.  * copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22.  * SOFTWARE.
  23.  */
  24.  
  25. #if __cplusplus >= 202001L
  26. #define STARSHIP_OP 1
  27. #endif
  28. #define BUILD_TEST_MAIN 1
  29.  
  30. #include <cstdint>
  31. #include <limits>
  32. #include <type_traits>
  33. #include <exception>
  34. #ifdef BUILD_TEST_MAIN
  35. #include <iostream>
  36. #endif
  37. #ifdef STARSHIP_OP
  38. #include <compare>
  39. #endif
  40.  
  41. template <typename T>
  42. class rov_int_template
  43. {
  44. protected:
  45.         T value_;
  46. public:
  47.         rov_int_template() : value_(0) { }
  48.         explicit rov_int_template(T value) : value_(value) { }
  49.  
  50.         operator T() const { return value_; }
  51.  
  52.         rov_int_template operator+(const rov_int_template& other) const
  53.         {
  54.                 return rov_int_template(value_ + other.value_);
  55.         }
  56.         rov_int_template operator-(const rov_int_template& other) const
  57.         {
  58.                 return rov_int_template(value_ - other.value_);
  59.         }
  60.         rov_int_template operator*(const rov_int_template& other) const
  61.         {
  62.                 return rov_int_template(value_ * other.value_);
  63.         }
  64.         rov_int_template operator/(const rov_int_template& other) const
  65.         {
  66.                 if (other.value_ == 0) {
  67.                         throw std::exception("Division by zero");
  68.                 }
  69.                 return rov_int_template(value_ / other.value_);
  70.         }
  71.         rov_int_template operator%(const rov_int_template& other) const
  72.         {
  73.                 if (other.value_ == 0) {
  74.                         throw std::exception("Modulo by zero");
  75.                 }
  76.                 return rov_int_template(value_ % other.value_);
  77.         }
  78.  
  79.         rov_int_template& operator+=(const rov_int_template& other)
  80.         {
  81.                 value_ += other.value_;
  82.                 return *this;
  83.         }
  84.         rov_int_template& operator-=(const rov_int_template& other)
  85.         {
  86.                 value_ -= other.value_;
  87.                 return *this;
  88.         }
  89.         rov_int_template& operator*=(const rov_int_template& other)
  90.         {
  91.                 value_ *= other.value_;
  92.                 return *this;
  93.         }
  94.         rov_int_template& operator/=(const rov_int_template& other)
  95.         {
  96.                 if (other.value_ == 0) {
  97.                         throw std::exception("Division by zero");
  98.                 }
  99.                 value_ /= other.value_;
  100.                 return *this;
  101.         }
  102.         rov_int_template& operator%=(const rov_int_template& other)
  103.         {
  104.                 if (other.value_ == 0) {
  105.                         throw std::exception("Modulo by zero");
  106.                 }
  107.                 value_ %= other.value_;
  108.                 return *this;
  109.         }
  110.  
  111.         rov_int_template operator&(const rov_int_template& other) const
  112.         {
  113.                 return rov_int_template(value_ & other.value_);
  114.         }
  115.         rov_int_template operator|(const rov_int_template& other) const
  116.         {
  117.                 return rov_int_template(value_ | other.value_);
  118.         }
  119.         rov_int_template operator^(const rov_int_template& other) const
  120.         {
  121.                 return rov_int_template(value_ ^ other.value_);
  122.         }
  123.         rov_int_template operator~() const
  124.         {
  125.                 return rov_int_template(~value_);
  126.         }
  127.         rov_int_template operator<<(int shift) const
  128.         {
  129.                 return rov_int_template(value_ << shift);
  130.         }
  131.         rov_int_template operator>>(int shift) const
  132.         {
  133.                 return rov_int_template(value_ >> shift);
  134.         }
  135.  
  136.         rov_int_template& operator&=(const rov_int_template& other)
  137.         {
  138.                 value_ &= other.value_;
  139.                 return *this;
  140.         }
  141.         rov_int_template& operator|=(const rov_int_template& other)
  142.         {
  143.                 value_ |= other.value_;
  144.                 return *this;
  145.         }
  146.         rov_int_template& operator^=(const rov_int_template& other)
  147.         {
  148.                 value_ ^= other.value_;
  149.                 return *this;
  150.         }
  151.         rov_int_template& operator<<=(int shift)
  152.         {
  153.                 value_ <<= shift;
  154.                 return *this;
  155.         }
  156.         rov_int_template& operator>>=(int shift)
  157.         {
  158.                 value_ >>= shift;
  159.                 return *this;
  160.         }
  161.  
  162.         bool operator==(const rov_int_template& other) const
  163.         {
  164.                 return value_ == other.value_;
  165.         }
  166.         bool operator!=(const rov_int_template& other) const
  167.         {
  168.                 return value_ != other.value_;
  169.         }
  170.         bool operator<(const rov_int_template& other) const
  171.         {
  172.                 return value_ < other.value_;
  173.         }
  174.         bool operator<=(const rov_int_template& other) const
  175.         {
  176.                 return value_ <= other.value_;
  177.         }
  178.         bool operator>(const rov_int_template& other) const
  179.         {
  180.                 return value_ > other.value_;
  181.         }
  182.         bool operator>=(const rov_int_template& other) const
  183.         {
  184.                 return value_ >= other.value_;
  185.         }
  186.  
  187. #ifdef STARSHIP_OP
  188.         auto operator<=>(const rov_int_template& other) const noexcept -> std::strong_ordering
  189.         {
  190.                 return value_ <=> other.value_;
  191.         }
  192. #endif /* STARSHIP_OP */
  193.  
  194.         rov_int_template& operator++()
  195.         {
  196.                 ++value_;
  197.                 return *this;
  198.         }
  199.         rov_int_template operator++(int)
  200.         {
  201.                 rov_int_template temp(*this);
  202.                 ++value_;
  203.                 return temp;
  204.         }
  205.         rov_int_template& operator--()
  206.         {
  207.                 --value_;
  208.                 return *this;
  209.         }
  210.         rov_int_template operator--(int)
  211.         {
  212.                 rov_int_template temp(*this);
  213.                 --value_;
  214.                 return temp;
  215.         }
  216.  
  217.         static constexpr T min()
  218.         {
  219.                 return std::numeric_limits<T>::min();
  220.         }
  221.         static constexpr T max()
  222.         {
  223.                 return std::numeric_limits<T>::max();
  224.         }
  225. };
  226.  
  227. #ifdef BUILD_TEST_MAIN
  228. int main(int ac, char *av[])
  229. {
  230.         rov_int_template<char> byte_int(21);
  231.         rov_int_template<short> short_int(300);
  232.         rov_int_template<int> int_value(4000);
  233.         rov_int_template<long> long_value(650000);
  234.         rov_int_template<long long> long_long_value(87000000);
  235.  
  236.         std::cout << "# compiled with C++ support __cplusplus=" << long(__cplusplus) << std::endl;
  237.  
  238. #ifdef STARSHIP_OP
  239.         std::cout << "# we support the starship operator" << std::endl;
  240. #endif /* STARSHIP_OP */
  241.         std::cout << byte_int+short_int+int_value+long_value+long_long_value << std::endl;
  242.  
  243.         return EXIT_SUCCESS;
  244. }
  245. #endif /* BUILD_TEST_MAIN */

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at