// Copyright 2018 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.

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

namespace zxdb {

// Storage for constants.
const int BaseType::kBaseTypeNone;
const int BaseType::kBaseTypeAddress;
const int BaseType::kBaseTypeBoolean;
const int BaseType::kBaseTypeFloat;
const int BaseType::kBaseTypeSigned;
const int BaseType::kBaseTypeSignedChar;
const int BaseType::kBaseTypeUnsigned;
const int BaseType::kBaseTypeUnsignedChar;
const int BaseType::kBaseTypeUTF;

BaseType::BaseType() : Type(DwarfTag::kBaseType) {}

BaseType::BaseType(int base_type, uint32_t byte_size, const std::string& name)
    : Type(DwarfTag::kBaseType), base_type_(base_type) {
  set_byte_size(byte_size);
  set_assigned_name(name);
}

BaseType::~BaseType() = default;

const BaseType* BaseType::AsBaseType() const { return this; }

const std::string& BaseType::GetAssignedName() const {
  const std::string& assigned_name = Type::GetAssignedName();
  if (!assigned_name.empty())
    return assigned_name;

  // Special-case void types with no assigned names.
  if (base_type_ == kBaseTypeNone) {
    static std::string void_str("void");
    return void_str;
  }

  return assigned_name;
}

}  // namespace zxdb
