//
// 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.
//

#ifndef COMPILER_PREPROCESSOR_TOKEN_H_
#define COMPILER_PREPROCESSOR_TOKEN_H_

#include <ostream>
#include <string>

#include "SourceLocation.h"

namespace pp
{

struct Token
{
    enum Type
    {
        LAST = 0,  // EOF.

        IDENTIFIER = 258,

        CONST_INT,
        CONST_FLOAT,

        OP_INC,
        OP_DEC,
        OP_LEFT,
        OP_RIGHT,
        OP_LE,
        OP_GE,
        OP_EQ,
        OP_NE,
        OP_AND,
        OP_XOR,
        OP_OR,
        OP_ADD_ASSIGN,
        OP_SUB_ASSIGN,
        OP_MUL_ASSIGN,
        OP_DIV_ASSIGN,
        OP_MOD_ASSIGN,
        OP_LEFT_ASSIGN,
        OP_RIGHT_ASSIGN,
        OP_AND_ASSIGN,
        OP_XOR_ASSIGN,
        OP_OR_ASSIGN,

        // Preprocessing token types.
        // These types are used by the preprocessor internally.
        // Preprocessor clients must not depend or check for them.
        PP_HASH,
        PP_NUMBER,
        PP_OTHER
    };
    enum Flags
    {
        AT_START_OF_LINE   = 1 << 0,
        HAS_LEADING_SPACE  = 1 << 1,
        EXPANSION_DISABLED = 1 << 2
    };

    Token() : type(0), flags(0) { }

    void reset();
    bool equals(const Token& other) const;

    // Returns true if this is the first token on line.
    // It disregards any leading whitespace.
    bool atStartOfLine() const { return (flags & AT_START_OF_LINE) != 0; }
    void setAtStartOfLine(bool start);

    bool hasLeadingSpace() const { return (flags & HAS_LEADING_SPACE) != 0; }
    void setHasLeadingSpace(bool space);

    bool expansionDisabled() const { return (flags & EXPANSION_DISABLED) != 0; }
    void setExpansionDisabled(bool disable);

    // Converts text into numeric value for CONST_INT and CONST_FLOAT token.
    // Returns false if the parsed value cannot fit into an int or float.
    bool iValue(int* value) const;
    bool uValue(unsigned int* value) const;
    bool fValue(float* value) const;

    int type;
    unsigned int flags;
    SourceLocation location;
    std::string text;
};

inline bool operator==(const Token& lhs, const Token& rhs)
{
    return lhs.equals(rhs);
}

inline bool operator!=(const Token& lhs, const Token& rhs)
{
    return !lhs.equals(rhs);
}

extern std::ostream& operator<<(std::ostream& out, const Token& token);

}  // namepsace pp
#endif  // COMPILER_PREPROCESSOR_TOKEN_H_
