// 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_DEVELOPER_DEBUG_ZXDB_SYMBOLS_TEMPLATE_PARAMETER_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_TEMPLATE_PARAMETER_H_

#include "src/developer/debug/zxdb/symbols/symbol.h"

namespace zxdb {

// DWARF annotates template definitions with a sequence of template parameter definitions so the
// debugger can figure out the types of each template. These are encoded in the same order as the
// template definition in the source code.
class TemplateParameter : public Symbol {
 public:
  // Construct with fxl::MakeRefCounted.

  // The template parameter name can be retrieved with GetAssignedName().

  // The type of this template parameter.
  const LazySymbol& type() const { return type_; }

  // The template parameters can either be types or values. We don't currently have a need for the
  // actual values so just encode that it was a value. The actual values could be added in the
  // future. In this example:
  //
  //   template<typename T, int i>
  //
  // The first parameter will be !is_value() with a name "T" and a type() of whatever it was
  // instantiated with. And the second will be is_valud() with a name "i", a type() "int", and
  // a value of whatever the value was.
  bool is_value() const { return is_value_; }

  // Symbol public overrides:
  const std::string& GetAssignedName() const override;

 protected:
  // Symbol protected overrides:
  const TemplateParameter* AsTemplateParameter() const override { return this; }

 private:
  FRIEND_REF_COUNTED_THREAD_SAFE(TemplateParameter);
  FRIEND_MAKE_REF_COUNTED(TemplateParameter);

  TemplateParameter(const std::string& name, LazySymbol type, bool is_value);
  ~TemplateParameter() override;

  // Symbol protected overrides.
  Identifier ComputeIdentifier() const override;

  std::string name_;
  LazySymbol type_;
  bool is_value_ = false;
};

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_TEMPLATE_PARAMETER_H_
