Skip to content

src/base/wrapper.hpp

Namespaces

Name
sgns
sgns::base

Classes

Name
struct sgns::base::Wrapper
Make strongly typed structures from different concepts of the equal types. E.g. block height and round number are both uint64_t, but better to be different types. Or, ID and Signature both vectors.
struct std::hash< sgns::base::Wrapper< T, Tag > >

Functions

Name
template <typename T ,typename Tag ,typename =std::enable_if_t>>
bool
operator<(const Wrapper< T, Tag > & a, const Wrapper< T, Tag > & b)

Functions Documentation

function operator<

template <typename T ,
typename Tag ,
typename  =std::enable_if_t<std::is_arithmetic_v<T>>>
bool operator<(
    const Wrapper< T, Tag > & a,
    const Wrapper< T, Tag > & b
)

Source code

#ifndef SUPERGENIUS_SRC_COMMON_WRAPPER_HPP
#define SUPERGENIUS_SRC_COMMON_WRAPPER_HPP

#include <type_traits>

#include <boost/operators.hpp>

namespace sgns::base {

  template <typename T, typename Tag>
  struct Wrapper {
    explicit Wrapper(T &&t) : data_(std::forward<T>(t)) {}

    T unwrap() {
      return data_;
    }

    const T &unwrap() const {
      return data_;
    }

    T &unwrap_mutable() {
      return data_;
    }

    bool operator==(const Wrapper<T, Tag> &other) const {
      return data_ == other.data_;
    }

   private:
    T data_;
  };

  template <typename T, typename Tag, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
  bool operator<( const Wrapper<T, Tag> &a, const Wrapper<T, Tag> &b )
  {
      return a.unwrap() < b.unwrap();
  }

}  // namespace sgns::base

template <typename T, typename Tag>
struct std::hash<sgns::base::Wrapper<T, Tag>> {
  std::size_t operator()(const sgns::base::Wrapper<T, Tag> &w) {
    return std::hash<T>()(w.unwrap());
  }
};

#endif  // SUPERGENIUS_SRC_COMMON_WRAPPER_HPP

Updated on 2026-03-04 at 13:10:44 -0800