//===--- SymbolID.cpp --------------------------------------------*- C++-*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "SymbolID.h"
#include "support/Logger.h"
#include "llvm/Support/SHA1.h"

namespace clang {
namespace clangd {

SymbolID::SymbolID(llvm::StringRef USR) {
  auto Hash = llvm::SHA1::hash(llvm::arrayRefFromStringRef(USR));
  static_assert(sizeof(Hash) >= RawSize, "RawSize larger than SHA1");
  memcpy(HashValue.data(), Hash.data(), RawSize);
}

llvm::StringRef SymbolID::raw() const {
  return llvm::StringRef(reinterpret_cast<const char *>(HashValue.data()),
                         RawSize);
}

SymbolID SymbolID::fromRaw(llvm::StringRef Raw) {
  SymbolID ID;
  assert(Raw.size() == RawSize);
  memcpy(ID.HashValue.data(), Raw.data(), RawSize);
  return ID;
}

std::string SymbolID::str() const { return llvm::toHex(raw()); }

llvm::Expected<SymbolID> SymbolID::fromStr(llvm::StringRef Str) {
  if (Str.size() != RawSize * 2)
    return error("Bad ID length");
  for (char C : Str)
    if (!llvm::isHexDigit(C))
      return error("Bad hex ID");
  return fromRaw(llvm::fromHex(Str));
}

llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID) {
  return OS << llvm::toHex(ID.raw());
}

llvm::hash_code hash_value(const SymbolID &ID) {
  // We already have a good hash, just return the first bytes.
  static_assert(sizeof(size_t) <= SymbolID::RawSize,
                "size_t longer than SHA1!");
  size_t Result;
  memcpy(&Result, ID.raw().data(), sizeof(size_t));
  return llvm::hash_code(Result);
}

} // namespace clangd
} // namespace clang
