/*-------------------------------------------------------------------------
 * drawElements Quality Program Random Shader Generator
 * ----------------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Token class.
 *//*--------------------------------------------------------------------*/

#include "rsgToken.hpp"
#include "deMemory.h"
#include "deString.h"

namespace rsg
{

Token::Token(const char *identifier) : m_type(IDENTIFIER)
{
    m_arg.identifier = deStrdup(identifier);
    if (!m_arg.identifier)
        throw std::bad_alloc();
}

Token::~Token(void)
{
    if (m_type == IDENTIFIER)
        deFree(m_arg.identifier);
}

Token &Token::operator=(const Token &other)
{
    if (m_type == IDENTIFIER)
    {
        deFree(m_arg.identifier);
        m_arg.identifier = DE_NULL;
    }

    m_type = other.m_type;

    if (m_type == IDENTIFIER)
    {
        m_arg.identifier = deStrdup(other.m_arg.identifier);
        if (!m_arg.identifier)
            throw std::bad_alloc();
    }
    else if (m_type == FLOAT_LITERAL)
        m_arg.floatValue = other.m_arg.floatValue;
    else if (m_type == INT_LITERAL)
        m_arg.intValue = other.m_arg.intValue;
    else if (m_type == BOOL_LITERAL)
        m_arg.boolValue = other.m_arg.boolValue;

    return *this;
}

Token::Token(const Token &other) : m_type(TYPE_LAST)
{
    *this = other;
}

bool Token::operator!=(const Token &other) const
{
    if (m_type != other.m_type)
        return false;

    if (m_type == IDENTIFIER && !deStringEqual(m_arg.identifier, other.m_arg.identifier))
        return false;
    else if (m_type == FLOAT_LITERAL && m_arg.floatValue != other.m_arg.floatValue)
        return false;
    else if (m_type == INT_LITERAL && m_arg.intValue != other.m_arg.intValue)
        return false;
    else if (m_type == BOOL_LITERAL && m_arg.boolValue != other.m_arg.boolValue)
        return false;

    return true;
}

TokenStream::TokenStream(void) : m_tokens(ALLOC_SIZE), m_numTokens(0)
{
}

TokenStream::~TokenStream(void)
{
}

} // namespace rsg
