diff options
author | 2019-11-29 14:23:45 -0800 | |
---|---|---|
committer | 2019-12-19 11:27:42 -0800 | |
commit | 3c82a306cd8d670103face9a60150e1cdb8e5a81 (patch) | |
tree | 2bd3b4c13a31d9abd6522c9974dbb8f9f68eaa53 /services/incremental/path.h | |
parent | 73b4b64be87b4fc1f1538e5f78eafd0c66e0bbc8 (diff) |
[incremental] native implementation of Incremental Service
The implementation of IIncrementalManager.aidl. TODO to refactor this.
Test: atest service.incremental_test
Change-Id: Ib8c8a9c0e7f0289b4bcd8961fa39746ed12b4310
Diffstat (limited to 'services/incremental/path.h')
-rw-r--r-- | services/incremental/path.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/services/incremental/path.h b/services/incremental/path.h new file mode 100644 index 000000000000..a1f4b8ec3093 --- /dev/null +++ b/services/incremental/path.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * 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 <optional> +#include <string> +#include <string_view> + +namespace android::incremental::path { + +namespace details { + +class CStrWrapper { +public: + CStrWrapper(std::string_view sv); + + CStrWrapper(const CStrWrapper&) = delete; + void operator=(const CStrWrapper&) = delete; + CStrWrapper(CStrWrapper&&) = delete; + void operator=(CStrWrapper&&) = delete; + + const char* get() const { return mCstr; } + operator const char*() const { return get(); } + +private: + const char* mCstr; + std::optional<std::string> mCopy; +}; + +void append_next_path(std::string& res, std::string_view c); + +} // namespace details + +// +// An std::map<> comparator that makes all nested paths to be ordered before the parents. +// + +struct PathCharsLess { + bool operator()(char l, char r) const; +}; + +struct PathLess { + using is_transparent = void; + bool operator()(std::string_view l, std::string_view r) const; +}; + +// +// Returns a zero-terminated version of a passed string view +// Only makes a copy if it wasn't zero-terminated already +// Useful for passing string view parameters to system functions. +// +inline details::CStrWrapper c_str(std::string_view sv) { + return {sv}; +} + +bool isAbsolute(std::string_view path); +std::string normalize(std::string_view path); +std::string_view dirname(std::string_view path); +std::string_view basename(std::string_view path); +std::optional<bool> isEmptyDir(std::string_view dir); +bool startsWith(std::string_view path, std::string_view prefix); + +template <class... Paths> +std::string join(std::string_view first, std::string_view second, Paths&&... paths) { + std::string result; + { + using std::size; + result.reserve(first.size() + second.size() + 1 + (sizeof...(paths) + ... + size(paths))); + } + result.assign(first); + (details::append_next_path(result, second), ..., details::append_next_path(result, paths)); + return result; +} + +} // namespace android::incremental::path |