/*
 * Copyright (C) 2019 CESNET, https://photonics.cesnet.cz/
 *
 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
 *
*/
#include "ast_values.hpp"

enum_::enum_() = default;

enum_::enum_(const std::string& value)
    : m_value(value)
{
}

identityRef_::identityRef_() = default;

identityRef_::identityRef_(const std::string& value)
    : m_value(value)
{
}

identityRef_::identityRef_(const std::string& module, const std::string& value)
    : m_prefix(module_{module})
    , m_value(value)
{
}

binary_::binary_() = default;

binary_::binary_(const std::string& value)
    : m_value(value)
{
}

empty_::empty_() = default;

bool bits_::operator==(const bits_& other) const
{
    return this->m_bits == other.m_bits;
}

bool bits_::operator<(const bits_& other) const
{
    return this->m_bits < other.m_bits;
}

bool module_::operator<(const module_& b) const
{
    return this->m_name < b.m_name;
}

bool identityRef_::operator==(const identityRef_& b) const
{
    return this->m_prefix == b.m_prefix && this->m_value == b.m_value;
}

bool identityRef_::operator<(const identityRef_& b) const
{
    return std::tie(this->m_prefix, this->m_value) < std::tie(b.m_prefix, b.m_value);
}

bool binary_::operator==(const binary_& b) const
{
    return this->m_value == b.m_value;
}

bool binary_::operator<(const binary_& b) const
{
    return this->m_value < b.m_value;
}

bool empty_::operator==(const empty_) const
{
    return true;
}

bool empty_::operator<(const empty_) const
{
    return false;
}

bool enum_::operator==(const enum_& b) const
{
    return this->m_value == b.m_value;
}

bool enum_::operator<(const enum_& b) const
{
    return this->m_value < b.m_value;
}

bool special_::operator==(const special_& b) const
{
    return this->m_value == b.m_value;
}

bool special_::operator<(const special_& b) const
{
    return this->m_value < b.m_value;
}

std::string specialValueToString(const special_& value)
{
    switch (value.m_value) {
    case SpecialValue::Container:
        return "(container)";
    case SpecialValue::PresenceContainer:
        return "(presence container)";
    case SpecialValue::List:
        return "(list)";
    case SpecialValue::LeafList:
        return "(leaflist)";
    }

    __builtin_unreachable();
}
