dvander@195: /* vim: set ts=4 sw=4 tw=99 et: dvander@195: * dvander@195: * Copyright (C) 2012 David Anderson dvander@195: * dvander@195: * This file is part of SourcePawn. dvander@195: * dvander@195: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@195: * the terms of the GNU General Public License as published by the Free dvander@195: * Software Foundation, either version 3 of the License, or (at your option) dvander@195: * any later version. dvander@195: * dvander@195: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@195: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@195: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@195: * dvander@195: * You should have received a copy of the GNU General Public License along with dvander@195: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@195: */ dvander@195: #ifndef _include_sp2_native_table_h_ dvander@195: #define _include_sp2_native_table_h_ dvander@195: dvander@196: #include dvander@195: #include "AllocatorPolicies.h" dvander@195: #include "Strings.h" dvander@195: #include "HashTable.h" dvander@195: #include "Vector.h" dvander@195: #include "VirtualObjectVisitor.h" dvander@195: dvander@195: namespace ke { dvander@195: dvander@195: class NativeTable dvander@195: { dvander@195: public: dvander@195: NativeTable(Zone *zone); dvander@195: ~NativeTable(); dvander@195: dvander@195: private: dvander@195: struct NativeInfo { dvander@195: Unbarriered name; dvander@195: void *address; dvander@195: size_t index; dvander@195: dvander@195: NativeInfo(String *name, void *address, size_t index) dvander@195: : address(address), dvander@195: index(index) dvander@195: { dvander@195: this->name = name; dvander@195: } dvander@195: }; dvander@195: dvander@195: struct Policy dvander@195: { dvander@195: typedef NativeInfo * Payload; dvander@195: dvander@195: static uint32 hash(const CharsAndLength &key) { dvander@195: return HashCharSequence(key.str(), key.length()); dvander@195: } dvander@195: dvander@195: static bool matches(const CharsAndLength &key, NativeInfo *info) { dvander@195: if (info->name->length() != key.length()) dvander@195: return false; dvander@195: return memcmp(info->name->chars(), key.str(), key.length() * sizeof(char)) == 0; dvander@195: } dvander@195: }; dvander@195: dvander@195: typedef HashTable NativeMap; dvander@195: dvander@195: public: dvander@195: bool initialize(); dvander@195: dvander@195: bool bind(const char *name, void *address); dvander@195: bool add(Handle name, size_t *indexp); dvander@195: String *name(size_t index) const { dvander@195: return natives_[index]->name; dvander@195: } dvander@195: void *address(size_t index) const { dvander@195: return natives_[index]->address; dvander@195: } dvander@195: dvander@195: void accept(VirtualObjectVisitor *visitor); dvander@195: dvander@195: private: dvander@195: Zone *zone_; dvander@195: NativeMap nativeMap_; dvander@195: Vector natives_; dvander@195: }; dvander@195: dvander@195: } dvander@195: dvander@195: #endif // _include_sp2_native_table_h_