/* * 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 "LexUtil.h" 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 { int result = 0; for (int i : s.fStates) { result = result * 101 + i; } return result; } }; } // namespace #endif