aboutsummaryrefslogtreecommitdiffstats
path: root/symtab.h
diff options
context:
space:
mode:
Diffstat (limited to 'symtab.h')
-rw-r--r--symtab.h228
1 files changed, 0 insertions, 228 deletions
diff --git a/symtab.h b/symtab.h
deleted file mode 100644
index 455d967..0000000
--- a/symtab.h
+++ /dev/null
@@ -1,228 +0,0 @@
-// 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 <bitset>
-#include <string>
-#include <vector>
-
-#include "string_piece.h"
-
-using namespace std;
-
-extern vector<string*>* g_symbols;
-
-class Symtab;
-class Var;
-
-class Symbol {
- public:
- explicit Symbol() : v_(-1) {}
-
- 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];
- }
-
- bool IsValid() const { return v_ >= 0; }
-
- Var* PeekGlobalVar() const;
- Var* GetGlobalVar() const;
- void SetGlobalVar(Var* v,
- bool is_override = false,
- bool* readonly = nullptr) const;
-
- private:
- explicit Symbol(int v);
-
- int v_;
-
- friend class Symtab;
- friend class SymbolSet;
-};
-
-/* A set of symbols represented as bitmap indexed by Symbol's ordinal value. */
-class SymbolSet {
- public:
- SymbolSet() : low_(0), high_(0) {}
-
- /* Returns true if Symbol belongs to this set. */
- bool exists(Symbol sym) const {
- size_t bit_nr = static_cast<size_t>(sym.val());
- return sym.IsValid() && bit_nr >= low_ && bit_nr < high_ &&
- bits_[(bit_nr - low_) / 64][(bit_nr - low_) % 64];
- }
-
- /* Adds Symbol to this set. */
- void insert(Symbol sym) {
- if (!sym.IsValid()) {
- return;
- }
- size_t bit_nr = static_cast<size_t>(sym.val());
- if (bit_nr < low_ || bit_nr >= high_) {
- resize(bit_nr);
- }
- bits_[(bit_nr - low_) / 64][(bit_nr - low_) % 64] = true;
- }
-
- /* Returns the number of Symbol's in this set. */
- size_t size() const {
- size_t n = 0;
- for (auto const& bitset : bits_) {
- n += bitset.count();
- }
- return n;
- }
-
- /* Allow using foreach.
- * E.g.,
- * SymbolSet symbol_set;
- * for (auto const& symbol: symbol_set) { ... }
- */
- class iterator {
- const SymbolSet* bitset_;
- size_t pos_;
-
- iterator(const SymbolSet* bitset, size_t pos)
- : bitset_(bitset), pos_(pos) {}
-
- /* Proceed to the next Symbol. */
- void next() {
- size_t bit_nr = (pos_ > bitset_->low_) ? pos_ - bitset_->low_ : 0;
- while (bit_nr < (bitset_->high_ - bitset_->low_)) {
- if ((bit_nr % 64) == 0 && !bitset_->bits_[bit_nr / 64].any()) {
- bit_nr += 64;
- continue;
- }
- if (bitset_->bits_[bit_nr / 64][bit_nr % 64]) {
- break;
- }
- ++bit_nr;
- }
- pos_ = bitset_->low_ + bit_nr;
- }
-
- public:
- iterator& operator++() {
- if (pos_ < bitset_->high_) {
- ++pos_;
- next();
- }
- return *this;
- }
-
- bool operator==(iterator other) const {
- return bitset_ == other.bitset_ && pos_ == other.pos_;
- }
-
- bool operator!=(iterator other) const { return !(*this == other); }
-
- Symbol operator*() { return Symbol(pos_); }
-
- friend class SymbolSet;
- };
-
- iterator begin() const {
- iterator it(this, low_);
- it.next();
- return it;
- }
-
- iterator end() const { return iterator(this, high_); }
-
- private:
- friend class iterator;
-
- /* Ensure that given bit number is in [low_, high_) */
- void resize(size_t bit_nr) {
- size_t new_low = bit_nr & ~63;
- size_t new_high = (bit_nr + 64) & ~63;
- if (bits_.empty()) {
- high_ = low_ = new_low;
- }
- if (new_low > low_) {
- new_low = low_;
- }
- if (new_high <= high_) {
- new_high = high_;
- }
- if (new_low == low_) {
- bits_.resize((new_high - new_low) / 64);
- } else {
- std::vector<std::bitset<64> > newbits((new_high - new_low) / 64);
- std::copy(bits_.begin(), bits_.end(),
- newbits.begin() + (low_ - new_low) / 64);
- bits_.swap(newbits);
- }
- low_ = new_low;
- high_ = new_high;
- }
-
- /* Keep only the (aligned) range where at least one bit has been set.
- * E.g., if we only ever set bits 65 and 141, |low_| will be 64, |high_|
- * will be 192, and |bits_| will have 2 elements.
- */
- size_t low_;
- size_t high_;
- std::vector<std::bitset<64> > bits_;
-};
-
-class ScopedGlobalVar {
- public:
- ScopedGlobalVar(Symbol name, Var* var);
- ~ScopedGlobalVar();
-
- private:
- Symbol name_;
- Var* orig_;
-};
-
-inline bool operator==(const Symbol& x, const Symbol& y) {
- return x.val() == y.val();
-}
-
-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(); }
-};
-} // namespace std
-
-extern Symbol kEmptySym;
-extern Symbol kShellSym;
-extern Symbol kKatiReadonlySym;
-
-void InitSymtab();
-void QuitSymtab();
-Symbol Intern(StringPiece s);
-
-string JoinSymbols(const vector<Symbol>& syms, const char* sep);
-
-#endif // SYMTAB_H_