1 /*
2  * Copyright (c) 2017 VMware, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <unistd.h>
18 
19 #include <clang/AST/Type.h>
20 
21 #include "table_storage_impl.h"
22 
23 namespace ebpf {
24 
25 using std::move;
26 using std::string;
27 using std::unique_ptr;
28 
29 const string Path::DELIM = "/";
30 
TableStorage()31 TableStorage::TableStorage() {}
~TableStorage()32 TableStorage::~TableStorage() {}
Init(unique_ptr<TableStorageImpl> impl)33 void TableStorage::Init(unique_ptr<TableStorageImpl> impl) { impl_ = move(impl); }
Find(const Path & path,TableStorage::iterator & result) const34 bool TableStorage::Find(const Path &path, TableStorage::iterator &result) const {
35   return impl_->Find(path.to_string(), result);
36 }
Insert(const Path & path,TableDesc && desc)37 bool TableStorage::Insert(const Path &path, TableDesc &&desc) {
38   return impl_->Insert(path.to_string(), move(desc));
39 }
Delete(const Path & path)40 bool TableStorage::Delete(const Path &path) { return impl_->Delete(path.to_string()); }
DeletePrefix(const Path & path)41 size_t TableStorage::DeletePrefix(const Path &path) {
42   size_t i = 0;
43   auto it = lower_bound(path);
44   auto upper = upper_bound(path);
45   while (it != upper) {
46     it = impl_->erase(*it.impl_);
47     ++i;
48   }
49   return i;
50 }
51 
AddMapTypesVisitor(unique_ptr<MapTypesVisitor> visitor)52 void TableStorage::AddMapTypesVisitor(unique_ptr<MapTypesVisitor> visitor) {
53   visitors_.push_back(move(visitor));
54 }
VisitMapType(TableDesc & desc,clang::ASTContext & C,clang::QualType key_type,clang::QualType leaf_type)55 void TableStorage::VisitMapType(TableDesc &desc, clang::ASTContext &C, clang::QualType key_type,
56                                 clang::QualType leaf_type) {
57   for (auto &v : visitors_)
58     v->Visit(desc, C, key_type, leaf_type);
59 }
60 
begin()61 TableStorage::iterator TableStorage::begin() { return impl_->begin(); }
end()62 TableStorage::iterator TableStorage::end() { return impl_->end(); }
lower_bound(const Path & p)63 TableStorage::iterator TableStorage::lower_bound(const Path &p) {
64   return impl_->lower_bound(p.to_string());
65 }
upper_bound(const Path & p)66 TableStorage::iterator TableStorage::upper_bound(const Path &p) {
67   return impl_->upper_bound(p.to_string() + "\x7f");
68 }
69 
70 /// TableStorage::iterator implementation
iterator()71 TableStorage::iterator::iterator() {}
iterator(unique_ptr<TableStorageIteratorImpl> impl)72 TableStorage::iterator::iterator(unique_ptr<TableStorageIteratorImpl> impl) : impl_(move(impl)) {}
iterator(const iterator & that)73 TableStorage::iterator::iterator(const iterator &that) : impl_(that.impl_->clone()) {}
~iterator()74 TableStorage::iterator::~iterator() {}
iterator(iterator && that)75 TableStorage::iterator::iterator(iterator &&that) { *this = move(that); }
operator =(iterator && that)76 TableStorage::iterator &TableStorage::iterator::operator=(iterator &&that) {
77   impl_ = move(that.impl_);
78   return *this;
79 }
80 
operator ++()81 TableStorage::iterator &TableStorage::iterator::operator++() {
82   ++*impl_;
83   return *this;
84 }
operator ++(int)85 TableStorage::iterator TableStorage::iterator::operator++(int) {
86   iterator tmp(*this);
87   operator++();
88   return tmp;
89 }
operator ==(const iterator & rhs) const90 bool TableStorage::iterator::operator==(const iterator &rhs) const {
91   // assumes that the underlying pair is stored in only one place
92   return &**impl_ == &**rhs.impl_;
93 }
operator !=(const iterator & rhs) const94 bool TableStorage::iterator::operator!=(const iterator &rhs) const {
95   return &**impl_ != &**rhs.impl_;
96 }
operator *() const97 TableStorage::iterator::reference TableStorage::iterator::operator*() const { return **impl_; }
operator ->() const98 TableStorage::iterator::pointer TableStorage::iterator::operator->() const { return &**impl_; }
99 
100 }  // namespace ebpf
101