50 using Size = uint32_t;
53 static Bindings EMPTY;
56 Size size_, capacity_;
59 Bindings(Size capacity) : size_(0), capacity_(capacity) { }
60 Bindings(
const Bindings & bindings) =
delete;
63 Size size()
const {
return size_; }
65 bool empty()
const {
return !size_; }
67 typedef Attr * iterator;
69 void push_back(
const Attr & attr)
71 assert(size_ < capacity_);
72 attrs[size_++] = attr;
78 iterator i = std::lower_bound(begin(), end(), key);
79 if (i != end() && i->name == name)
return i;
86 iterator i = std::lower_bound(begin(), end(), key);
87 if (i != end() && i->name == name)
return &*i;
91 iterator begin() {
return &attrs[0]; }
92 iterator end() {
return &attrs[size_]; }
94 Attr & operator[](Size pos)
101 Size capacity() {
return capacity_; }
108 std::vector<const Attr *> res;
110 for (Size n = 0; n < size_; n++)
111 res.emplace_back(&attrs[n]);
112 std::sort(res.begin(), res.end(), [&](
const Attr * a,
const Attr * b) {
113 std::string_view sa = symbols[a->name], sb = symbols[b->name];