blob: 221140107793a74578ab296affc9bd4b2d399c0d [file] [log] [blame]
/*
* 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 <unistd.h>
#include <clang/AST/Type.h>
#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<TableStorageImpl> 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<MapTypesVisitor> 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<TableStorageIteratorImpl> 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