diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-29 18:38:35 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-29 20:49:28 +0900 |
commit | e7992752dbfe23d0a88312b4279531c39512b9a6 (patch) | |
tree | ebbbff517aed82fe2b04d9cbb0903865fc997c44 /symtab.h | |
parent | 94d7a61c9edd45b6c6b0f19c60e64aeddfdc8e46 (diff) | |
download | android_build_kati-e7992752dbfe23d0a88312b4279531c39512b9a6.tar.gz android_build_kati-e7992752dbfe23d0a88312b4279531c39512b9a6.tar.bz2 android_build_kati-e7992752dbfe23d0a88312b4279531c39512b9a6.zip |
[C++] Introduce Symbol
Diffstat (limited to 'symtab.h')
-rw-r--r-- | symtab.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/symtab.h b/symtab.h new file mode 100644 index 0000000..55e1ce3 --- /dev/null +++ b/symtab.h @@ -0,0 +1,76 @@ +// Copyright 2015 Google Inc. All rights reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SYMTAB_H_ +#define SYMTAB_H_ + +#include <string> +#include <vector> + +#include "string_piece.h" + +using namespace std; + +extern vector<string>* g_symbols; + +class Symtab; + +class Symbol { + public: + const string& str() const { + return (*g_symbols)[v_]; + } + + const char* c_str() const { + return str().c_str(); + } + + bool empty() const { return !v_; } + + int val() const { return v_; } + + char get(size_t i) const { + const string& s = str(); + if (i >= s.size()) + return 0; + return s[i]; + } + + private: + explicit Symbol(int v); + + int v_; + + friend class Symtab; +}; + +inline bool operator==(const Symbol& x, const Symbol& y) { + return x.val() == y.val(); +} + +namespace std { +template<> struct hash<Symbol> { + size_t operator()(const Symbol& s) const { + return s.val(); + } +}; +} + +void InitSymtab(); +void QuitSymtab(); +Symbol Intern(StringPiece s); + +string JoinSymbols(const vector<Symbol>& syms, const char* sep); + +#endif // SYMTAB_H_ |