text: // Copyright 2020 the V8 project authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "include/cppgc/internal/name-trait.h"
  
  #include <stdio.h>
  
  #include "src/base/logging.h"
  #include "src/base/macros.h"
  
  namespace cppgc {
  
  // static
  constexpr const char NameProvider::kHiddenName[];
  
  // static
  constexpr const char NameProvider::kNoNameDeducible[];
  
  namespace internal {
  
  // static
  HeapObjectName NameTraitBase::GetNameFromTypeSignature(const char* signature) {
    // Parsing string of structure:
    //    static HeapObjectName NameTrait<int>::GetNameFor(...) [T = int]
    if (!signature) return {NameProvider::kNoNameDeducible, true};
  
    const std::string raw(signature);
    const auto start_pos = raw.rfind("T = ") + 4;
    DCHECK_NE(std::string::npos, start_pos);
    const auto len = raw.length() - start_pos - 1;
    const std::string name = raw.substr(start_pos, len).c_str();
    char* name_buffer = new char[name.length() + 1];
    int written = snprintf(name_buffer, name.length() + 1, "%s", name.c_str());
    DCHECK_EQ(static_cast<size_t>(written), name.length());
    USE(written);
    return {name_buffer, false};
  }
  
  }  // namespace internal
  }  // namespace cppgc
  