/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SKSL_DFASTATE
#define SKSL_DFASTATE

#include "src/sksl/lex/LexUtil.h"

#include <vector>
#include <string>

struct DFAState {
    struct Label {
        std::vector<int> fStates;

        Label(std::vector<int> states)
        : fStates(std::move(states)) {}

        bool operator==(const Label& other) const {
            return fStates == other.fStates;
        }

        bool operator!=(const Label& other) const {
            return !(*this == other);
        }

        std::string description() const {
            std::string result = "<";
            const char* separator = "";
            for (int s : fStates) {
                result += separator;
                result += std::to_string(s);
                separator = ", ";
            }
            result += ">";
            return result;
        }
    };

    DFAState()
    : fId(INVALID)
    , fLabel({}) {}

    DFAState(int id, Label label)
    : fId(id)
    , fLabel(std::move(label)) {}

    DFAState(const DFAState& other) = delete;

    int fId;

    Label fLabel;

    bool fIsScanned = false;
};

namespace std {
    template<> struct hash<DFAState::Label> {
        size_t operator()(const DFAState::Label& s) const {
            size_t result = 0;
            for (int i : s.fStates) {
                result = result * 101 + i;
            }
            return result;
        }
    };
} // namespace

#endif
