36 #include <llvm/ADT/Twine.h>
44 State* State::Builder::Build() {
45 llvm::OwningPtr<State> New(
new State(States.size(), Start, Accept, Name));
46 States.push_back(New.get());
49 auto& Refs = New->VariableReferences;
50 Refs.reset(
new const Argument*[RefCount]);
51 bzero(Refs.get(), RefCount *
sizeof(Refs[0]));
63 void State::AddTransition(OwningPtr<Transition>& T)
65 Transitions.push_back(T.take());
70 if (VariableReferences && !T.
InScope())
73 OwningArrayPtr<const Argument*> Args;
77 assert(!VariableReferences
78 || (NewRefs.size() == 0)
79 || (Refs.size() == NewRefs.size()));
80 const size_t Len = NewRefs.size();
81 assert(Len < 8 *
sizeof(Mask()));
83 if (!VariableReferences) {
85 VariableReferences.reset(
new const Argument*[Len]);
86 memcpy(VariableReferences.get(), NewRefs.data(), Len *
sizeof(Refs[0]));
94 for (
auto *Arg : NewRefs) {
98 assert(Arg->type() == Argument::Variable);
99 assert(((
size_t) Arg->index()) <= Len);
102 uint32_t NewMask = 0;
103 for (
size_t i = 0; i < Len; i++) {
104 if ((NewRefs[i] != NULL) && (NewRefs[i]->type() == Argument::Constant))
108 assert((Mask() & NewMask) == NewMask);
113 uint32_t State::Mask()
const {
117 for (
size_t i = 0; i < Refs.size(); i++) {
118 if (Refs[i] && Refs[i]->type() == Argument::Variable)
126 string State::Name(
bool QuoteNonNumeric)
const {
127 std::stringstream ss;
131 auto Quote = (QuoteNonNumeric ?
"'" :
"");
132 ss << Quote << name << Quote;
139 string State::String()
const {
140 assert(VariableReferences);
142 std::stringstream ss;
143 ss <<
"state " << Name(
true) <<
" " <<
InstanceName(Refs,
true) <<
":";
145 for (
const auto& I : Transitions) {
153 string State::Dot()
const {
154 assert(VariableReferences);
155 string NameExtra = name.empty() ?
"" : (
"\\n\\\"" + name +
"\\\"");
160 +
"state " + Twine(ID())
163 + (IsAcceptingState() ?
", shape = doublecircle" :
"")