class BindMap { public: // This class represents a mapping between a parameter name and its // associated parameter index in a prepared statement. class Pair { friend class BindMap; public: inline int GetIndex() { return index; } inline v8::Local GetName(v8::Isolate* isolate) { return v8::Local::New(isolate, name); } private: explicit Pair(v8::Isolate* isolate, const char* _name, int _index) : name(isolate, InternalizedFromUtf8(isolate, _name, -1)), index(_index) {} explicit Pair(v8::Isolate* isolate, Pair* pair) : name(isolate, pair->name), index(pair->index) {} const CopyablePersistent name; const int index; }; explicit BindMap(char _) { assert(_ == 0); pairs = NULL; capacity = 0; length = 0; } ~BindMap() { while (length) pairs[--length].~Pair(); FREE_ARRAY(pairs); } inline Pair* GetPairs() { return pairs; } inline int GetSize() { return length; } // Adds a pair to the bind map, expanding the capacity if necessary. void Add(v8::Isolate* isolate, const char* name, int index) { assert(name != NULL); if (capacity == length) Grow(isolate); new (pairs + length++) Pair(isolate, name, index); } private: void Grow(v8::Isolate* isolate) { assert(capacity == length); capacity = (capacity << 1) | 2; Pair* new_pairs = ALLOC_ARRAY(capacity); for (int i=0; i(pairs); pairs = new_pairs; } Pair* pairs; int capacity; int length; };