// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_IDENTIFIER_H_
#define SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_IDENTIFIER_H_

#include <cstdint>
#include <functional>
#include <string>

#include "src/lib/fxl/strings/string_printf.h"

namespace bt {

template <typename T>
struct IdentifierTraits {
  // Returns a string representation of |value|.
  static std::string ToString(T value) { return std::to_string(value); }
};

// Specializations for integer types return a fixed-length string.
template <>
struct IdentifierTraits<uint64_t> {
  static std::string ToString(uint64_t value) { return fxl::StringPrintf("%.16lx", value); }
};

// Opaque identifier type for host library layers.
template <typename T>
class Identifier {
  static_assert(std::is_trivial_v<T>);
  static_assert(!std::is_pointer_v<std::decay<T>>);

 public:
  using Traits = IdentifierTraits<T>;

  constexpr explicit Identifier(const T& value) : value_(value) {}
  Identifier() = default;

  T value() const { return value_; }

  // Comparison.
  bool operator==(const Identifier& other) const { return value_ == other.value_; }
  bool operator!=(const Identifier& other) const { return value_ != other.value_; }

  // Returns a string representation of this identifier. This function allocates
  // memory.
  std::string ToString() const { return Traits::ToString(value_); }

 private:
  T value_;
};

// Opaque identifier type for Bluetooth peers.
class PeerId : public Identifier<uint64_t> {
 public:
  constexpr explicit PeerId(uint64_t value) : Identifier<uint64_t>(value) {}
  constexpr PeerId() : PeerId(0u) {}

  bool IsValid() const { return value() != 0u; }
};

constexpr PeerId kInvalidPeerId(0u);

// Generates a valid random peer identifier. This function can never return
// kInvalidPeerId.
PeerId RandomPeerId();

}  // namespace bt

// Specialization of std::hash for std::unordered_set, std::unordered_map, etc.
namespace std {

template <typename T>
struct hash<bt::Identifier<T>> {
  size_t operator()(const bt::Identifier<T>& id) const { return std::hash<T>()(id.value()); }
};

template <>
struct hash<bt::PeerId> {
  size_t operator()(const bt::PeerId& id) const {
    return std::hash<decltype(id.value())>()(id.value());
  }
};

}  // namespace std

#endif  // SRC_CONNECTIVITY_BLUETOOTH_CORE_BT_HOST_COMMON_IDENTIFIER_H_
