#pragma once #include #include "commons/commons_inline_string.h" #include "commons/commons_inline_vec.h" #include "commons/commons_macros.h" constexpr inline uint8_t kPathSep = '/'; namespace InlinePath { template INLINE void Append(inline_string& self, byteview suffix) { if (self.size > 0 && InlineVec_Back(self) != kPathSep) InlineString_AppendSuffix(self, kPathSep); InlineString_AppendSuffix(self, suffix); } template INLINE auto PopBack(inline_string& self) -> byteview { if (!self.size) return { }; for (uint64_t i = self.size - 1; i >= 0; --i) { if (self[i] == kPathSep) { byteview ret { .data = &self[i + 1], .size = self.size - i - 1 }; self.size = i + 1; return ret; } } self.size = 0; return self; } template INLINE auto TrySetFileExtension(inline_string& self, byteview ext) -> bool { if (!self.size) return false; if (InlineVec_Back(self) == kPathSep) return false; for (uint64_t i = self.size - 1; i >= 0; --i) { switch (self[i]) { case kPathSep: { InlineString_AppendSuffix(self, ext); return true; } case '.': { self.size = i; InlineString_AppendSuffix(self, ext); return true; } } } InlineString_AppendSuffix(self, ext); return true; } } // namespace InlinePath