/* * Copyright (c) 2017 VMware, Inc. * * 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. */ #include #include #include "table_storage_impl.h" namespace ebpf { using std::move; using std::string; using std::unique_ptr; const string Path::DELIM = "/"; TableStorage::TableStorage() {} TableStorage::~TableStorage() {} void TableStorage::Init(unique_ptr impl) { impl_ = move(impl); } bool TableStorage::Find(const Path &path, TableStorage::iterator &result) const { return impl_->Find(path.to_string(), result); } bool TableStorage::Insert(const Path &path, TableDesc &&desc) { return impl_->Insert(path.to_string(), move(desc)); } bool TableStorage::Delete(const Path &path) { return impl_->Delete(path.to_string()); } size_t TableStorage::DeletePrefix(const Path &path) { size_t i = 0; auto it = lower_bound(path); auto upper = upper_bound(path); while (it != upper) { it = impl_->erase(*it.impl_); ++i; } return i; } void TableStorage::AddMapTypesVisitor(unique_ptr visitor) { visitors_.push_back(move(visitor)); } void TableStorage::VisitMapType(TableDesc &desc, clang::ASTContext &C, clang::QualType key_type, clang::QualType leaf_type) { for (auto &v : visitors_) v->Visit(desc, C, key_type, leaf_type); } TableStorage::iterator TableStorage::begin() { return impl_->begin(); } TableStorage::iterator TableStorage::end() { return impl_->end(); } TableStorage::iterator TableStorage::lower_bound(const Path &p) { return impl_->lower_bound(p.to_string()); } TableStorage::iterator TableStorage::upper_bound(const Path &p) { return impl_->upper_bound(p.to_string() + "\x7f"); } /// TableStorage::iterator implementation TableStorage::iterator::iterator() {} TableStorage::iterator::iterator(unique_ptr impl) : impl_(move(impl)) {} TableStorage::iterator::iterator(const iterator &that) : impl_(that.impl_->clone()) {} TableStorage::iterator::~iterator() {} TableStorage::iterator::iterator(iterator &&that) { *this = move(that); } TableStorage::iterator &TableStorage::iterator::operator=(iterator &&that) { impl_ = move(that.impl_); return *this; } TableStorage::iterator &TableStorage::iterator::operator++() { ++*impl_; return *this; } TableStorage::iterator TableStorage::iterator::operator++(int) { iterator tmp(*this); operator++(); return tmp; } bool TableStorage::iterator::operator==(const iterator &rhs) const { // assumes that the underlying pair is stored in only one place return &**impl_ == &**rhs.impl_; } bool TableStorage::iterator::operator!=(const iterator &rhs) const { return &**impl_ != &**rhs.impl_; } TableStorage::iterator::reference TableStorage::iterator::operator*() const { return **impl_; } TableStorage::iterator::pointer TableStorage::iterator::operator->() const { return &**impl_; } } // namespace ebpf