// Code generated by "stringer -bitset -type scoreAdjustTyp"; DO NOT EDIT.

package inlheur

import "strconv"
import "bytes"

func _() {
	// An "invalid array index" compiler error signifies that the constant values have changed.
	// Re-run the stringer command to generate them again.
	var x [1]struct{}
	_ = x[panicPathAdj-1]
	_ = x[initFuncAdj-2]
	_ = x[inLoopAdj-4]
	_ = x[passConstToIfAdj-8]
	_ = x[passConstToNestedIfAdj-16]
	_ = x[passConcreteToItfCallAdj-32]
	_ = x[passConcreteToNestedItfCallAdj-64]
	_ = x[passFuncToIndCallAdj-128]
	_ = x[passFuncToNestedIndCallAdj-256]
	_ = x[passInlinableFuncToIndCallAdj-512]
	_ = x[passInlinableFuncToNestedIndCallAdj-1024]
	_ = x[returnFeedsConstToIfAdj-2048]
	_ = x[returnFeedsFuncToIndCallAdj-4096]
	_ = x[returnFeedsInlinableFuncToIndCallAdj-8192]
	_ = x[returnFeedsConcreteToInterfaceCallAdj-16384]
}

var _scoreAdjustTyp_value = [...]uint64{
	0x1,    /* panicPathAdj */
	0x2,    /* initFuncAdj */
	0x4,    /* inLoopAdj */
	0x8,    /* passConstToIfAdj */
	0x10,   /* passConstToNestedIfAdj */
	0x20,   /* passConcreteToItfCallAdj */
	0x40,   /* passConcreteToNestedItfCallAdj */
	0x80,   /* passFuncToIndCallAdj */
	0x100,  /* passFuncToNestedIndCallAdj */
	0x200,  /* passInlinableFuncToIndCallAdj */
	0x400,  /* passInlinableFuncToNestedIndCallAdj */
	0x800,  /* returnFeedsConstToIfAdj */
	0x1000, /* returnFeedsFuncToIndCallAdj */
	0x2000, /* returnFeedsInlinableFuncToIndCallAdj */
	0x4000, /* returnFeedsConcreteToInterfaceCallAdj */
}

const _scoreAdjustTyp_name = "panicPathAdjinitFuncAdjinLoopAdjpassConstToIfAdjpassConstToNestedIfAdjpassConcreteToItfCallAdjpassConcreteToNestedItfCallAdjpassFuncToIndCallAdjpassFuncToNestedIndCallAdjpassInlinableFuncToIndCallAdjpassInlinableFuncToNestedIndCallAdjreturnFeedsConstToIfAdjreturnFeedsFuncToIndCallAdjreturnFeedsInlinableFuncToIndCallAdjreturnFeedsConcreteToInterfaceCallAdj"

var _scoreAdjustTyp_index = [...]uint16{0, 12, 23, 32, 48, 70, 94, 124, 144, 170, 199, 234, 257, 284, 320, 357}

func (i scoreAdjustTyp) String() string {
	var b bytes.Buffer

	remain := uint64(i)
	seen := false

	for k, v := range _scoreAdjustTyp_value {
		x := _scoreAdjustTyp_name[_scoreAdjustTyp_index[k]:_scoreAdjustTyp_index[k+1]]
		if v == 0 {
			if i == 0 {
				b.WriteString(x)
				return b.String()
			}
			continue
		}
		if (v & remain) == v {
			remain &^= v
			x := _scoreAdjustTyp_name[_scoreAdjustTyp_index[k]:_scoreAdjustTyp_index[k+1]]
			if seen {
				b.WriteString("|")
			}
			seen = true
			b.WriteString(x)
		}
	}
	if remain == 0 {
		return b.String()
	}
	return "scoreAdjustTyp(0x" + strconv.FormatInt(int64(i), 16) + ")"
}
