1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SKSL_DFASTATE 9*c8dee2aaSAndroid Build Coastguard Worker #define SKSL_DFASTATE 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/lex/LexUtil.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 14*c8dee2aaSAndroid Build Coastguard Worker #include <string> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker struct DFAState { 17*c8dee2aaSAndroid Build Coastguard Worker struct Label { 18*c8dee2aaSAndroid Build Coastguard Worker std::vector<int> fStates; 19*c8dee2aaSAndroid Build Coastguard Worker LabelDFAState::Label20*c8dee2aaSAndroid Build Coastguard Worker Label(std::vector<int> states) 21*c8dee2aaSAndroid Build Coastguard Worker : fStates(std::move(states)) {} 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker bool operator==(const Label& other) const { 24*c8dee2aaSAndroid Build Coastguard Worker return fStates == other.fStates; 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker bool operator!=(const Label& other) const { 28*c8dee2aaSAndroid Build Coastguard Worker return !(*this == other); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_DEBUG descriptionDFAState::Label32*c8dee2aaSAndroid Build Coastguard Worker std::string description() const { 33*c8dee2aaSAndroid Build Coastguard Worker std::string result = "<"; 34*c8dee2aaSAndroid Build Coastguard Worker const char* separator = ""; 35*c8dee2aaSAndroid Build Coastguard Worker for (int s : fStates) { 36*c8dee2aaSAndroid Build Coastguard Worker result += separator; 37*c8dee2aaSAndroid Build Coastguard Worker result += std::to_string(s); 38*c8dee2aaSAndroid Build Coastguard Worker separator = ", "; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker result += ">"; 41*c8dee2aaSAndroid Build Coastguard Worker return result; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker #endif 44*c8dee2aaSAndroid Build Coastguard Worker }; 45*c8dee2aaSAndroid Build Coastguard Worker DFAStateDFAState46*c8dee2aaSAndroid Build Coastguard Worker DFAState() 47*c8dee2aaSAndroid Build Coastguard Worker : fId(INVALID) 48*c8dee2aaSAndroid Build Coastguard Worker , fLabel({}) {} 49*c8dee2aaSAndroid Build Coastguard Worker DFAStateDFAState50*c8dee2aaSAndroid Build Coastguard Worker DFAState(int id, Label label) 51*c8dee2aaSAndroid Build Coastguard Worker : fId(id) 52*c8dee2aaSAndroid Build Coastguard Worker , fLabel(std::move(label)) {} 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker DFAState(const DFAState& other) = delete; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker int fId; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker Label fLabel; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker bool fIsScanned = false; 61*c8dee2aaSAndroid Build Coastguard Worker }; 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker namespace std { 64*c8dee2aaSAndroid Build Coastguard Worker template<> struct hash<DFAState::Label> { 65*c8dee2aaSAndroid Build Coastguard Worker size_t operator()(const DFAState::Label& s) const { 66*c8dee2aaSAndroid Build Coastguard Worker size_t result = 0; 67*c8dee2aaSAndroid Build Coastguard Worker for (int i : s.fStates) { 68*c8dee2aaSAndroid Build Coastguard Worker result = result * 101 + i; 69*c8dee2aaSAndroid Build Coastguard Worker } 70*c8dee2aaSAndroid Build Coastguard Worker return result; 71*c8dee2aaSAndroid Build Coastguard Worker } 72*c8dee2aaSAndroid Build Coastguard Worker }; 73*c8dee2aaSAndroid Build Coastguard Worker } // namespace 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker #endif 76