Skip to content

Commit dacfaa4

Browse files
committed
Continued refactor of Path related containers.
1 parent 7b0990d commit dacfaa4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+314
-215
lines changed

source/code/core/collections/public/ice/string/editable_operations.hxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ namespace ice::string
118118

119119
// Operators
120120

121+
using ReadOnlyOperations::operator[];
122+
121123
template<MutableStringType Self>
122124
constexpr auto operator[](this Self& self, ice::nindex index) noexcept -> typename Self::ValueType&
123125
{

source/code/core/collections/public/ice/string/string_concepts.hxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ namespace ice::string
6060
template<ice::concepts::StringType StringT>
6161
using CharType = ConstCorrectCharType<StringT>;
6262

63+
template<ice::concepts::StringType StringT>
64+
using String = typename StringT::StringType;
65+
6366
} // namespace ice::string
6467

6568
namespace ice::string::detail

source/code/core/utils/private/params.cxx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,41 @@ namespace ice
324324
return true;
325325
}
326326

327+
template<>
328+
bool params_define_internal<ice::Path>(
329+
CLI::App& app,
330+
ice::Allocator&,
331+
ice::ParamDefinition const& definition,
332+
ice::Path& out_value
333+
) noexcept
334+
{
335+
auto fn_callback = [&out_value](CLI::results_t const& results) noexcept
336+
{
337+
out_value = ice::String{ results.front() };
338+
return true;
339+
};
340+
params_setup(app.add_option(to_std(definition.name), ice::move(fn_callback)), definition);
341+
return true;
342+
}
343+
344+
template<>
345+
bool params_define_internal<ice::HeapPath>(
346+
CLI::App& app,
347+
ice::Allocator&,
348+
ice::ParamDefinition const& definition,
349+
ice::HeapPath& out_value
350+
) noexcept
351+
{
352+
auto fn_callback = [&out_value](CLI::results_t const& results) noexcept
353+
{
354+
std::string const& arg = results.front();
355+
out_value.push_back(ice::String{ std::string_view{ arg } });
356+
return true;
357+
};
358+
params_setup(app.add_option(to_std(definition.name), ice::move(fn_callback)), definition);
359+
return true;
360+
}
361+
327362
template<>
328363
bool params_define_internal<ice::Array<ice::String>>(
329364
CLI::App& app,
@@ -439,6 +474,8 @@ namespace ice
439474
IMPL_PARAMS_DEFINE(u64)
440475
IMPL_PARAMS_DEFINE(ice::String)
441476
IMPL_PARAMS_DEFINE(ice::HeapString<>)
477+
IMPL_PARAMS_DEFINE(ice::Path)
478+
IMPL_PARAMS_DEFINE(ice::HeapPath)
442479
IMPL_PARAMS_DEFINE(ice::Array<ice::String>)
443480
IMPL_PARAMS_DEFINE(ice::Array<ice::HeapString<>>)
444481

source/code/core/utils/public/ice/native_file.hxx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,7 @@ namespace ice::native_file
1919
#if ISP_WINDOWS
2020
using File = ice::win32::FileHandle;
2121
using FilePath = ice::BasicPath<ice::wchar>;
22-
struct HeapFilePath : public ice::HeapString<ice::wchar>, public ice::PathString
23-
{
24-
using HeapString<ice::wchar>::HeapString;
25-
using HeapString<ice::wchar>::operator ice::BasicString<ice::wchar>;
26-
27-
constexpr operator FilePath() const noexcept { return { _data, _size }; }
28-
};
22+
using HeapFilePath = ice::BasicHeapPath<ice::wchar>;
2923
# define ISP_PATH_LITERAL(val) L##val
3024
#elif ISP_UNIX
3125
using File = ice::unix_::FileHandle;

source/code/core/utils/public/ice/params.hxx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
/// SPDX-License-Identifier: MIT
33

44
#pragma once
5-
#include <ice/params_types.hxx>
65
#include <ice/array.hxx>
7-
#include <ice/heap_string.hxx>
6+
#include <ice/params_types.hxx>
7+
#include <ice/path_utils.hxx>
88

99
namespace ice
1010
{
@@ -93,6 +93,8 @@ namespace ice
9393
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::i64& out_value) noexcept;
9494
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::String& out_value) noexcept;
9595
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::HeapString<>& out_value) noexcept;
96+
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::Path& out_value) noexcept;
97+
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::HeapPath& out_value) noexcept;
9698

9799
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::Array<ice::String>& out_values) noexcept;
98100
template<> bool params_define(ice::Params& params, ice::ParamDefinition const& definition, ice::Array<ice::HeapString<>>& out_values) noexcept;

source/code/core/utils/public/ice/path_utils.hxx

Lines changed: 122 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,68 +6,11 @@
66
#include <ice/heap_string.hxx>
77
#include <ice/log_formatters.hxx>
88

9-
namespace ice
10-
{
11-
12-
struct PathString
13-
{
14-
template<ice::concepts::SupportedCharType CharT>
15-
static constexpr ice::BasicString<CharT> Separator_Dot;
16-
template<ice::concepts::SupportedCharType CharT>
17-
static constexpr ice::BasicString<CharT> Separator_Drive;
18-
template<ice::concepts::SupportedCharType CharT>
19-
static constexpr ice::BasicString<CharT> Separator_Directory;
20-
21-
template<> constexpr ice::BasicString<char> Separator_Dot<char> = ".";
22-
template<> constexpr ice::BasicString<char> Separator_Drive<char> = ":";
23-
template<> constexpr ice::BasicString<char> Separator_Directory<char> = "\\/";
24-
template<> constexpr ice::BasicString<ice::wchar> Separator_Dot<ice::wchar> = L".";
25-
template<> constexpr ice::BasicString<ice::wchar> Separator_Drive<ice::wchar> = L":";
26-
template<> constexpr ice::BasicString<ice::wchar> Separator_Directory<ice::wchar> = L"\\/";
27-
28-
template<typename Self>
29-
bool is_absolute(this Self const& self) noexcept
30-
{
31-
using CharType = ice::string::CharType<Self>;
32-
33-
if constexpr (ice::build::is_windows)
34-
{
35-
if (self.size() >= 3_count)
36-
{
37-
return self[1] == Separator_Drive<CharType>[0] && Separator_Directory<CharType>.find_first_of(self[2]) != ice::nindex_none;
38-
}
39-
return false;
40-
}
41-
else
42-
{
43-
return self.not_empty() && self.front() == Separator_Directory<CharType>[1];
44-
}
45-
}
46-
47-
template<typename Self>
48-
bool is_relative(this Self const& self) noexcept
49-
{
50-
return self.is_absolute() == false;
51-
}
52-
};
53-
54-
template<ice::concepts::SupportedCharType CharT>
55-
struct BasicPath : public ice::BasicString<CharT>, public ice::PathString
56-
{
57-
using BasicString<CharT>::BasicString;
58-
using BasicString<CharT>::operator std::basic_string_view<CharT>;
59-
60-
constexpr BasicPath(ice::BasicString<CharT> str) noexcept
61-
: BasicString<CharT>{ str }
62-
{ }
63-
};
64-
65-
using Path = ice::BasicPath<char>;
66-
67-
} // namespace
68-
699
namespace ice::path
7010
{
11+
//! \note On windows: starts with a drive letter, on linux: checks for starting backslash.
12+
//! \return true If the path is absolute.
13+
bool is_absolute(ice::String path) noexcept;
7114

7215
//! \return true If the path is just the root part. (ex. 'C:/' or '/')
7316
bool is_absolute_root(ice::String path) noexcept;
@@ -127,8 +70,117 @@ namespace ice::path
12770
auto replace_filename(ice::HeapString<ice::wchar>& path, ice::WString filename) noexcept -> ice::WString;
12871
auto replace_extension(ice::HeapString<ice::wchar>& path, ice::WString extension) noexcept -> ice::WString;
12972

73+
template<ice::concepts::StringType StringT>
74+
using Path = typename StringT::PathType;
75+
13076
} // namespace ice::path
13177

78+
namespace ice
79+
{
80+
81+
struct PathString
82+
{
83+
template<ice::concepts::SupportedCharType CharT>
84+
static constexpr ice::BasicString<CharT> Separator_Dot;
85+
template<ice::concepts::SupportedCharType CharT>
86+
static constexpr ice::BasicString<CharT> Separator_Drive;
87+
template<ice::concepts::SupportedCharType CharT>
88+
static constexpr ice::BasicString<CharT> Separator_Directory;
89+
90+
template<> constexpr ice::BasicString<char> Separator_Dot<char> = ".";
91+
template<> constexpr ice::BasicString<char> Separator_Drive<char> = ":";
92+
template<> constexpr ice::BasicString<char> Separator_Directory<char> = "\\/";
93+
template<> constexpr ice::BasicString<ice::wchar> Separator_Dot<ice::wchar> = L".";
94+
template<> constexpr ice::BasicString<ice::wchar> Separator_Drive<ice::wchar> = L":";
95+
template<> constexpr ice::BasicString<ice::wchar> Separator_Directory<ice::wchar> = L"\\/";
96+
97+
template<typename Self>
98+
bool is_absolute(this Self const& self) noexcept
99+
{
100+
return ice::path::is_absolute(self);
101+
}
102+
103+
template<typename Self>
104+
bool is_relative(this Self const& self) noexcept
105+
{
106+
return self.is_absolute() == false;
107+
}
108+
109+
template<typename Self>
110+
constexpr auto extension(this Self const& self) noexcept -> ice::string::String<Self>
111+
{
112+
return ice::path::extension(self);
113+
}
114+
115+
template<typename Self>
116+
constexpr auto filename(this Self const& self) noexcept -> ice::string::String<Self>
117+
{
118+
return ice::path::filename(self);
119+
}
120+
121+
template<typename Self>
122+
constexpr auto basename(this Self const& self) noexcept -> ice::string::String<Self>
123+
{
124+
return ice::path::basename(self);
125+
}
126+
127+
template<typename Self>
128+
constexpr auto directory(this Self const& self) noexcept -> ice::path::Path<Self>
129+
{
130+
return ice::path::Path<Self>{ ice::path::directory(self) };
131+
}
132+
};
133+
134+
struct HeapPathString : public PathString
135+
{
136+
template<typename Self>
137+
auto append(this Self& self, ice::path::Path<Self> other) noexcept -> ice::path::Path<Self>
138+
{
139+
return ice::path::Path<Self>{ ice::path::join(self, other) };
140+
}
141+
};
142+
143+
template<ice::concepts::SupportedCharType CharT>
144+
struct BasicPath : public ice::BasicString<CharT>, public ice::PathString
145+
{
146+
using BasicString<CharT>::BasicString;
147+
using BasicString<CharT>::operator std::basic_string_view<CharT>;
148+
using PathType = ice::BasicPath<CharT>;
149+
150+
constexpr BasicPath(ice::BasicString<CharT> str) noexcept
151+
: BasicString<CharT>{ str }
152+
{}
153+
};
154+
155+
template<ice::concepts::SupportedCharType CharT>
156+
struct BasicHeapPath : public ice::HeapString<CharT>, public ice::HeapPathString
157+
{
158+
using HeapString<CharT>::HeapString;
159+
using HeapString<CharT>::operator ice::BasicString<CharT>;
160+
using HeapString<CharT>::operator =;
161+
using PathType = ice::BasicPath<CharT>;
162+
163+
constexpr operator ice::BasicPath<CharT>() const noexcept { return { this->data(), this->size() }; }
164+
};
165+
166+
using Path = ice::BasicPath<char>;
167+
using HeapPath = ice::BasicHeapPath<char>;
168+
169+
template<typename CharT>
170+
auto hash(ice::BasicPath<CharT> path) noexcept
171+
{
172+
return ice::hash(ice::String{ path });
173+
}
174+
175+
template<typename CharT>
176+
auto hash(ice::BasicHeapPath<CharT> path) noexcept
177+
{
178+
return ice::hash(ice::String{ path });
179+
}
180+
181+
} // namespace
182+
183+
132184
template<typename CharType>
133185
struct fmt::formatter<ice::BasicPath<CharType>> : public fmt::formatter<std::basic_string_view<CharType>>
134186
{
@@ -138,3 +190,13 @@ struct fmt::formatter<ice::BasicPath<CharType>> : public fmt::formatter<std::bas
138190
return fmt::formatter<std::basic_string_view<CharType>>::format(value, ctx);
139191
}
140192
};
193+
194+
template<typename CharType>
195+
struct fmt::formatter<ice::BasicHeapPath<CharType>> : public fmt::formatter<ice::BasicPath<CharType>>
196+
{
197+
template<typename FormatContext>
198+
constexpr auto format(ice::BasicHeapPath<CharType> value, FormatContext& ctx) const noexcept
199+
{
200+
return fmt::formatter<ice::BasicPath<CharType>>::format(value, ctx);
201+
}
202+
};

source/code/framework/framework_base/private/framework_main.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ auto ice_setup(
329329
ice::Array<ice::String> resource_paths{ alloc };
330330
if constexpr (ice::build::is_release == false && (ice::build::is_windows || ice::build::is_linux))
331331
{
332-
dylib_path = ice::path::directory(ice::app::directory());
332+
dylib_path = ice::app::directory().directory();
333333
config.dev_dirs.shaders = ice::app::workingdir();
334334
config.dev_dirs.assets = ice::app::workingdir();
335335

source/code/modules/shader_tools/private/shader_tools_glsl.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,9 @@ namespace ice
502502
) noexcept -> ice::TaskExpected<ice::String, ice::ErrorCode>
503503
{
504504
ice::ResourceResult const result = co_await tracker.load_resource(source);
505-
ice::String const path = ice::resource_origin(source);
505+
ice::Path const path = ice::resource_origin(source);
506506

507-
if (ice::path::extension(path) == ".asl")
507+
if (path.extension() == ".asl")
508508
{
509509
auto import_loader = ice::create_script_loader(alloc, tracker);
510510

@@ -542,8 +542,8 @@ namespace ice
542542
{
543543
ShaderCompilerContext& sctx = *shader_context(ctx);
544544

545-
ice::String const path = ice::resource_origin(source);
546-
ice::String const ext = ice::path::extension(path);
545+
ice::Path const path = ice::resource_origin(source);
546+
ice::String const ext = path.extension();
547547
bool const is_vertex_shader = path.substr(path.size() - (4 + ext.size()), ext.size()) == "vert";
548548

549549
ice::render::ShaderStageFlags const shader_stage = is_vertex_shader

source/code/modules/shader_tools/private/shader_tools_wgsl.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,9 @@ namespace ice
404404
) noexcept -> ice::TaskExpected<ice::String, ice::ErrorCode>
405405
{
406406
ice::ResourceResult const result = co_await tracker.load_resource(source);
407-
ice::String const path = ice::resource_origin(source);
407+
ice::Path const path = ice::resource_origin(source);
408408

409-
if (ice::path::extension(path) == ".asl")
409+
if (path.extension() == ".asl")
410410
{
411411
auto import_loader = ice::create_script_loader(alloc, tracker);
412412

@@ -445,8 +445,8 @@ namespace ice
445445
{
446446
ShaderCompilerContext& sctx = *shader_context(ctx);
447447

448-
ice::String const path = ice::resource_origin(source);
449-
ice::String const ext = ice::path::extension(path);
448+
ice::Path const path = ice::resource_origin(source);
449+
ice::String const ext = path.extension();
450450
bool const is_vertex_shader = path.substr(path.size() - (4 + ext.size()), ext.size()) == "vert";
451451

452452
ice::render::ShaderStageFlags const shader_stage = is_vertex_shader

source/code/modules/vulkan_renderer/private/vk_shader_asset.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace ice::render::vk
2525
return AssetState::Baked;
2626
}
2727

28-
ice::String const ext = ice::path::extension(uri.path());
28+
ice::String const ext = uri.path().extension();
2929
if (ext == ".glsl" || ext == ".asl")
3030
{
3131
return AssetState::Raw;

0 commit comments

Comments
 (0)