/* * 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. */ #pragma once #include #include #include #include #include #include #include "table_desc.h" namespace ebpf { typedef std::map> fake_fd_map_def; class TableStorageImpl; class TableStorageIteratorImpl; class Path { public: static const std::string DELIM; Path() = default; Path(const Path &other) = default; Path &operator=(const Path &other) = default; Path(std::initializer_list parts) { size_t len = parts.size() * DELIM.size(); for (const auto &s : parts) len += s.size(); path_.reserve(len); for (const auto &s : parts) path_ += DELIM + s; } const std::string &to_string() const { return path_; } private: std::string path_; }; class TableStorage { public: /// iterator is an abstract class for traversing the map entries in a table /// storage object. class iterator { private: friend class TableStorage; iterator(const iterator &); public: typedef std::pair value_type; typedef std::ptrdiff_t difference_type; typedef value_type *pointer; typedef value_type &reference; typedef std::forward_iterator_tag iterator_category; typedef iterator self_type; iterator(); iterator(std::unique_ptr); ~iterator(); iterator(iterator &&); iterator &operator=(iterator &&); self_type &operator++(); self_type operator++(int); bool operator==(const self_type &) const; bool operator!=(const self_type &) const; value_type &operator*() const; pointer operator->() const; private: std::unique_ptr impl_; }; TableStorage(); ~TableStorage(); void Init(std::unique_ptr); bool Find(const Path &path, TableStorage::iterator &result) const; bool Insert(const Path &path, TableDesc &&desc); bool Delete(const Path &path); size_t DeletePrefix(const Path &path); void AddMapTypesVisitor(std::unique_ptr); void VisitMapType(TableDesc &desc, clang::ASTContext &C, clang::QualType key_type, clang::QualType leaf_type); iterator begin(); iterator end(); iterator lower_bound(const Path &p); iterator upper_bound(const Path &p); private: std::unique_ptr impl_; std::vector> visitors_; }; std::unique_ptr createSharedTableStorage(); std::unique_ptr createBpfFsTableStorage(); }