// WARNING: This file is machine generated by fidlgen_cpp.

#pragma once

#include <fidl/test/consts/cpp/natural_types.h>
#include <fidl/test/consts/llcpp/fidl.h>

namespace fidl_test_consts {
using EnumType = ::fidl::test::consts::EnumType;

using BitsType = ::fidl::test::consts::BitsType;
const static BitsType BitsTypeMask = ::fidl::test::consts::BitsTypeMask;

extern const char* USERNAME;

constexpr uint32_t POPULATION_USA_2018 =
    ::fidl::test::consts::POPULATION_USA_2018;

constexpr int8_t OFFSET = ::fidl::test::consts::OFFSET;

constexpr float MIN_TEMP = ::fidl::test::consts::MIN_TEMP;

constexpr uint64_t FUCHSIA = ::fidl::test::consts::FUCHSIA;

constexpr ::fidl_test_consts::EnumType enumVal = ::fidl::test::consts::enumVal;

constexpr ::fidl_test_consts::EnumType enumTrue =
    ::fidl::test::consts::enumTrue;

constexpr int32_t enumPrimitiveVal = ::fidl::test::consts::enumPrimitiveVal;

constexpr int32_t enumPrimitiveTrue = ::fidl::test::consts::enumPrimitiveTrue;

constexpr bool ENABLED_FLAG = ::fidl::test::consts::ENABLED_FLAG;

constexpr uint64_t DIAMOND = ::fidl::test::consts::DIAMOND;

constexpr double CONVERSION_FACTOR = ::fidl::test::consts::CONVERSION_FACTOR;

constexpr ::fidl_test_consts::BitsType bitsVal = ::fidl::test::consts::bitsVal;

constexpr ::fidl_test_consts::BitsType bitsTrue =
    ::fidl::test::consts::bitsTrue;

constexpr int32_t bitsPrimitiveVal = ::fidl::test::consts::bitsPrimitiveVal;

constexpr int32_t bitsPrimitiveTrue = ::fidl::test::consts::bitsPrimitiveTrue;

constexpr uint16_t ANSWER_IN_BINARY = ::fidl::test::consts::ANSWER_IN_BINARY;

constexpr uint16_t ANSWER = ::fidl::test::consts::ANSWER;

}  // namespace fidl_test_consts
