diff options
author | An-Cheng Huang <ancheng@vyatta.com> | 2011-03-17 11:48:54 -0700 |
---|---|---|
committer | An-Cheng Huang <ancheng@vyatta.com> | 2011-03-17 11:48:54 -0700 |
commit | eb9f5718d412022015bb65eb08c30785c79e79e6 (patch) | |
tree | be0b6a9de27965e39c44c5c8a88adf9caa13abf8 /src/cstore/unionfs/fspath.hpp | |
parent | cda3f423c311fd30e8cc24e2de67d99baf352b2a (diff) | |
download | vyatta-cfg-eb9f5718d412022015bb65eb08c30785c79e79e6.tar.gz vyatta-cfg-eb9f5718d412022015bb65eb08c30785c79e79e6.zip |
add config path abstraction and high-level caching
* part of the config backend cleanup/optimization work.
* improves the performance of "load" (w/o commit) by ~55% and "show" by ~15%.
Diffstat (limited to 'src/cstore/unionfs/fspath.hpp')
-rw-r--r-- | src/cstore/unionfs/fspath.hpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/cstore/unionfs/fspath.hpp b/src/cstore/unionfs/fspath.hpp new file mode 100644 index 0000000..35985ed --- /dev/null +++ b/src/cstore/unionfs/fspath.hpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 Vyatta, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _FSPATH_HPP_ +#define _FSPATH_HPP_ +#include <string> + +#include <cstore/svector.hpp> + +namespace cstore { // begin namespace cstore +namespace unionfs { // begin namespace unionfs + +class FsPath { +public: + FsPath() : _data() {}; + explicit FsPath(const char *full_path) : _data() { operator=(full_path); }; + explicit FsPath(const std::string& full_path) : _data() { + operator=(full_path); + }; + FsPath(const FsPath& p) : _data() { operator=(p); }; + ~FsPath() {}; + + void push(const char *comp) { _data.push_back(comp); }; + void push(const std::string& comp) { _data.push_back(comp.c_str()); }; + void pop() { _data.pop_back(); }; + void pop(std::string& last) { _data.pop_back(last); }; + + FsPath& operator=(const char *full_path) { + _data = full_path; + return *this; + }; + FsPath& operator=(const std::string& full_path) { + _data = full_path; + return *this; + }; + FsPath& operator=(const FsPath& p) { + _data = p._data; + return *this; + }; + FsPath& operator/=(const FsPath& p) { + _data /= p._data; + return *this; + } + FsPath operator/(const FsPath& rhs) { + FsPath lhs(*this); + lhs /= rhs; + return lhs; + }; + + bool operator==(const FsPath& rhs) const { + return (_data == rhs._data); + }; + + size_t length() const { return _data.length(); }; + bool has_parent_path() const { return (_data.size() > 0); }; + const char *path_cstr() const { return _data.get_cstr(); }; + size_t hash() const { return _data.hash(); }; + +private: + struct FsPathParams { + static const char separator = '/'; + static const size_t static_num_elems = 24; + static const size_t static_buf_len = 256; + }; + + cstore::svector<FsPathParams> _data; +}; + +struct FsPathHash { + inline size_t operator()(const FsPath& p) const { + return p.hash(); + }; +}; + +} // end namespace unionfs +} // end namespace cstore + +#endif /* _FSPATH_HPP_ */ + |