From 8429ee39f25b738f8ee540ea63be02394eb879cc Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Tue, 29 Oct 2024 22:09:09 +0100 Subject: [PATCH] common/filepath: un-inline methods to reduce header dependencies Signed-off-by: Max Kellermann --- src/CMakeLists.txt | 1 + src/crimson/CMakeLists.txt | 1 + src/include/filepath.cc | 146 +++++++++++++++++++++++++++++++++++++ src/include/filepath.h | 132 ++++----------------------------- 4 files changed, 164 insertions(+), 116 deletions(-) create mode 100644 src/include/filepath.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1e21cb21f36..ada75e281c5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -500,6 +500,7 @@ set(libcommon_files ceph_ver.c global/global_context.cc xxHash/xxhash.c + include/filepath.cc include/invoke_date.cc include/object.cc include/types.cc diff --git a/src/crimson/CMakeLists.txt b/src/crimson/CMakeLists.txt index 8fb417fe359..4133494039c 100644 --- a/src/crimson/CMakeLists.txt +++ b/src/crimson/CMakeLists.txt @@ -98,6 +98,7 @@ add_library(crimson-common STATIC ${PROJECT_SOURCE_DIR}/src/crush/CrushTester.cc ${PROJECT_SOURCE_DIR}/src/global/global_context.cc ${PROJECT_SOURCE_DIR}/src/global/pidfile.cc + ${PROJECT_SOURCE_DIR}/src/include/filepath.cc ${PROJECT_SOURCE_DIR}/src/include/object.cc ${PROJECT_SOURCE_DIR}/src/include/types.cc ${PROJECT_SOURCE_DIR}/src/include/utime.cc diff --git a/src/include/filepath.cc b/src/include/filepath.cc new file mode 100644 index 00000000000..25d52eb0cc3 --- /dev/null +++ b/src/include/filepath.cc @@ -0,0 +1,146 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2004-2006 Sage Weil + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include "filepath.h" +#include "common/Formatter.h" + +#include + +void filepath::rebuild_path() { + path.clear(); + for (unsigned i=0; i 0) || encoded) { + // skip empty components unless they were introduced deliberately + // see commit message for more detail + bits.push_back( path.substr(off,nextslash-off) ); + } + off = nextslash+1; + } +} + +void filepath::set_path(std::string_view s) { + if (!s.empty() && s[0] == '/') { + path = s.substr(1); + ino = 1; + } else { + ino = 0; + path = s; + } + bits.clear(); +} + +filepath filepath::prefixpath(int s) const { + filepath t(ino); + for (int i=0; i 0) + parse_bits(); + bits.pop_back(); + rebuild_path(); +} + +void filepath::push_dentry(std::string_view s) { + if (bits.empty() && path.length() > 0) + parse_bits(); + if (!bits.empty()) + path += "/"; + path += s; + bits.emplace_back(s); +} + +void filepath::push_front_dentry(const std::string& s) { + bits.insert(bits.begin(), s); + rebuild_path(); +} + +void filepath::append(const filepath& a) { + ceph_assert(a.pure_relative()); + for (unsigned i=0; idump_unsigned("base_ino", ino); + f->dump_string("relative_path", path); +} + +void filepath::generate_test_instances(std::list& o) { + o.push_back(new filepath); + o.push_back(new filepath("/usr/bin", 0)); + o.push_back(new filepath("/usr/sbin", 1)); + o.push_back(new filepath("var/log", 1)); + o.push_back(new filepath("foo/bar", 101)); +} + +bool filepath::is_last_dot_or_dotdot() const { + if (depth() > 0) { + std::string dname = last_dentry(); + if (dname == "." || dname == "..") { + return true; + } + } + + return false; +} + +std::ostream& operator<<(std::ostream& out, const filepath& path) +{ + if (path.get_ino()) { + out << '#' << path.get_ino(); + if (path.length()) + out << '/'; + } + return out << path.get_path(); +} diff --git a/src/include/filepath.h b/src/include/filepath.h index 4b71ef2bedb..b36f616dd8f 100644 --- a/src/include/filepath.h +++ b/src/include/filepath.h @@ -33,8 +33,7 @@ #include "encoding.h" #include "include/fs_types.h" // for inodeno_t -#include "common/Formatter.h" - +namespace ceph { class Formatter; } class filepath { inodeno_t ino = 0; // base inode. ino=0 implies pure relative path. @@ -48,28 +47,8 @@ class filepath { mutable std::vector bits; bool encoded = false; - void rebuild_path() { - path.clear(); - for (unsigned i=0; i 0) || encoded) { - // skip empty components unless they were introduced deliberately - // see commit message for more detail - bits.push_back( path.substr(off,nextslash-off) ); - } - off = nextslash+1; - } - } + void rebuild_path(); + void parse_bits() const; public: filepath() = default; @@ -97,17 +76,8 @@ class filepath { path = s; ino = b; } - void set_path(std::string_view s) { - if (!s.empty() && s[0] == '/') { - path = s.substr(1); - ino = 1; - } else { - ino = 0; - path = s; - } - bits.clear(); - } + void set_path(std::string_view s); // accessors inodeno_t get_ino() const { return ino; } @@ -154,19 +124,8 @@ class filepath { return bits[ bits.size()-1 ]; } - filepath prefixpath(int s) const { - filepath t(ino); - for (int i=0; i 0) - parse_bits(); - bits.pop_back(); - rebuild_path(); - } - void push_dentry(std::string_view s) { - if (bits.empty() && path.length() > 0) - parse_bits(); - if (!bits.empty()) - path += "/"; - path += s; - bits.emplace_back(s); - } + void pop_dentry(); + void push_dentry(std::string_view s); void push_dentry(const std::string& s) { push_dentry(std::string_view(s)); } void push_dentry(const char *cs) { push_dentry(std::string_view(cs, strlen(cs))); } - void push_front_dentry(const std::string& s) { - bits.insert(bits.begin(), s); - rebuild_path(); - } - void append(const filepath& a) { - ceph_assert(a.pure_relative()); - for (unsigned i=0; idump_unsigned("base_ino", ino); - f->dump_string("relative_path", path); - } - static void generate_test_instances(std::list& o) { - o.push_back(new filepath); - o.push_back(new filepath("/usr/bin", 0)); - o.push_back(new filepath("/usr/sbin", 1)); - o.push_back(new filepath("var/log", 1)); - o.push_back(new filepath("foo/bar", 101)); - } + void encode(ceph::buffer::list& bl) const; + void decode(ceph::buffer::list::const_iterator& blp); + void dump(ceph::Formatter *f) const; + static void generate_test_instances(std::list& o); - bool is_last_dot_or_dotdot() const { - if (depth() > 0) { - std::string dname = last_dentry(); - if (dname == "." || dname == "..") { - return true; - } - } - - return false; - } + bool is_last_dot_or_dotdot() const; bool is_last_snap() const { // walk into snapdir? @@ -255,14 +163,6 @@ class filepath { WRITE_CLASS_ENCODER(filepath) -inline std::ostream& operator<<(std::ostream& out, const filepath& path) -{ - if (path.get_ino()) { - out << '#' << path.get_ino(); - if (path.length()) - out << '/'; - } - return out << path.get_path(); -} +std::ostream& operator<<(std::ostream& out, const filepath& path); #endif -- 2.39.5