Program Listing for File RootID.hpp

Return to documentation for file (include/dish2/genome/RootID.hpp)

#pragma once
#ifndef DISH2_GENOME_ROOTID_HPP_INCLUDE
#define DISH2_GENOME_ROOTID_HPP_INCLUDE

#include <atomic>
#include <ratio>
#include <tuple>
#include <utility>

#include "../../../third-party/cereal/include/cereal/cereal.hpp"
#include "../../../third-party/conduit/include/uitsl/debug/audit_cast.hpp"
#include "../../../third-party/conduit/include/uitsl/math/math_utils.hpp"
#include "../../../third-party/conduit/include/uitsl/mpi/comm_utils.hpp"

namespace dish2 {

class RootID {

  inline static std::atomic< uint64_t > root_id_counter{};

  uint64_t root_id;

public:

  RootID() = default;

  RootID(std::in_place_t) : root_id( uitsl::sidebyside_hash< std::ratio<3, 4> >(
    uitsl::audit_cast<uint64_t>( uitsl::get_proc_id() ),
    root_id_counter++
  ) ) {}

  RootID(const uint64_t root_id_) : root_id( root_id_ ) {}

  bool operator<(const RootID& other) const {
    return root_id < other.root_id;
  }

  bool operator==(const RootID& other) const {
    return root_id == other.root_id;
  }

  bool operator!=(const RootID& other) const { return !operator==(other); }

  operator size_t() const { return root_id; }

  template <class Archive>
  void serialize( Archive & ar ) { ar( CEREAL_NVP( root_id ) ); }

  size_t GetID() const { return root_id; }

  void SetID( const size_t id ) { root_id = id; }

};

} // namespace dish2

#endif // #ifndef DISH2_GENOME_ROOTID_HPP_INCLUDE