//
// Copyright (c) 2011 The ANGLE Project 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 "Token.h"

#include <cassert>

#include "numeric_lex.h"

namespace pp
{

void Token::reset()
{
    type = 0;
    flags = 0;
    location = SourceLocation();
    text.clear();
}

bool Token::equals(const Token& other) const
{
    return (type == other.type) &&
           (flags == other.flags) &&
           (location == other.location) &&
           (text == other.text);
}

void Token::setAtStartOfLine(bool start)
{
    if (start)
        flags |= AT_START_OF_LINE;
    else
        flags &= ~AT_START_OF_LINE;
}

void Token::setHasLeadingSpace(bool space)
{
    if (space)
        flags |= HAS_LEADING_SPACE;
    else
        flags &= ~HAS_LEADING_SPACE;
}

void Token::setExpansionDisabled(bool disable)
{
    if (disable)
        flags |= EXPANSION_DISABLED;
    else
        flags &= ~EXPANSION_DISABLED;
}

bool Token::iValue(int* value) const
{
    assert(type == CONST_INT);
    return numeric_lex_int(text, value);
}

bool Token::uValue(unsigned int* value) const
{
    assert(type == CONST_INT);
    return numeric_lex_int(text, value);
}

bool Token::fValue(float* value) const
{
    assert(type == CONST_FLOAT);
    return numeric_lex_float(text, value);
}

std::ostream& operator<<(std::ostream& out, const Token& token)
{
    if (token.hasLeadingSpace())
        out << " ";

    out << token.text;
    return out;
}

}  // namespace pp
