fs/Path: add GetSuffix()
This commit is contained in:
		@@ -295,6 +295,15 @@ public:
 | 
				
			|||||||
		return Traits::Relative(c_str(), other_fs.c_str());
 | 
							return Traits::Relative(c_str(), other_fs.c_str());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Returns the filename suffix (including the dot) or nullptr
 | 
				
			||||||
 | 
						 * if the path does not have one.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						[[gnu::pure]]
 | 
				
			||||||
 | 
						const_pointer GetSuffix() const noexcept {
 | 
				
			||||||
 | 
							return Path{*this}.GetSuffix();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Returns the filename extension (excluding the dot) or
 | 
						 * Returns the filename extension (excluding the dot) or
 | 
				
			||||||
	 * nullptr if the path does not have one.
 | 
						 * nullptr if the path does not have one.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,7 +37,7 @@ Path::ToUTF8Throw() const
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Path::const_pointer
 | 
					Path::const_pointer
 | 
				
			||||||
Path::GetExtension() const noexcept
 | 
					Path::GetSuffix() const noexcept
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const auto *base = GetBase().c_str();
 | 
						const auto *base = GetBase().c_str();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,9 +46,16 @@ Path::GetExtension() const noexcept
 | 
				
			|||||||
	while (*base == '.')
 | 
						while (*base == '.')
 | 
				
			||||||
		++base;
 | 
							++base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const auto *dot = StringFindLast(base, '.');
 | 
						return StringFindLast(base, '.');
 | 
				
			||||||
	if (dot == nullptr)
 | 
					}
 | 
				
			||||||
		return nullptr;
 | 
					
 | 
				
			||||||
 | 
					Path::const_pointer
 | 
				
			||||||
	return dot + 1;
 | 
					Path::GetExtension() const noexcept
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const auto *result = GetSuffix();
 | 
				
			||||||
 | 
						if (result != nullptr)
 | 
				
			||||||
 | 
							/* skip the dot */
 | 
				
			||||||
 | 
							++result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -166,6 +166,13 @@ public:
 | 
				
			|||||||
		return Traits::IsAbsolute(c_str());
 | 
							return Traits::IsAbsolute(c_str());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Returns the filename suffix (including the dot) or nullptr
 | 
				
			||||||
 | 
						 * if the path does not have one.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						[[gnu::pure]]
 | 
				
			||||||
 | 
						const_pointer GetSuffix() const noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Returns the filename extension (excluding the dot) or
 | 
						 * Returns the filename extension (excluding the dot) or
 | 
				
			||||||
	 * nullptr if the path does not have one.
 | 
						 * nullptr if the path does not have one.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,3 +79,20 @@ TEST(Path, Extension)
 | 
				
			|||||||
	EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc")).GetExtension(), "abc");
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc")).GetExtension(), "abc");
 | 
				
			||||||
	EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc.def")).GetExtension(), "def");
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc.def")).GetExtension(), "def");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(Path, Suffix)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("foo")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo/bar")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo/./bar")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo/.bar")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo/.")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo/..")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo.abc/bar")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_EQ(Path::FromFS(PATH_LITERAL("/foo.abc/")).GetSuffix(), nullptr);
 | 
				
			||||||
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo.abc/bar.def")).GetSuffix(), ".def");
 | 
				
			||||||
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo.abc/bar.")).GetSuffix(), ".");
 | 
				
			||||||
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo.abc/bar.def.ghi")).GetSuffix(), ".ghi");
 | 
				
			||||||
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc")).GetSuffix(), ".abc");
 | 
				
			||||||
 | 
						EXPECT_STREQ(Path::FromFS(PATH_LITERAL("/foo/.bar.abc.def")).GetSuffix(), ".def");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user