//
// Copyright 2020 The ANGLE 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.
//

#ifndef COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_IDGEN_H_
#define COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_IDGEN_H_

#include "common/angleutils.h"
#include "compiler/translator/TranslatorMetalDirect/Name.h"

namespace sh
{

// For creating new fresh names.
// All names created are marked as SymbolType::AngleInternal.
class IdGen : angle::NonCopyable
{
  public:
    IdGen();

    Name createNewName(const ImmutableString &baseName);
    Name createNewName(const Name &baseName);
    Name createNewName(const char *baseName);
    Name createNewName(std::initializer_list<ImmutableString> baseNames);
    Name createNewName(std::initializer_list<Name> baseNames);
    Name createNewName(std::initializer_list<const char *> baseNames);
    Name createNewName();

  private:
    template <typename String, typename StringToImmutable>
    Name createNewName(size_t count, const String *baseNames, const StringToImmutable &toImmutable);

  private:
    unsigned mNext = 0;          // `unsigned` because of "%u" use in sprintf
    std::string mNewNameBuffer;  // reusable buffer to avoid tons of reallocations
};

}  // namespace sh

#endif  // COMPILER_TRANSLATOR_TRANSLATORMETALDIRECT_IDGEN_H_
