diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-06-29 11:50:55 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-06-29 13:18:32 -0700 |
| commit | f4d900dfb64d95f121dd8565dd269be061ef8509 (patch) | |
| tree | e9aad4ff9a6111d828ae2e4b217dc8145cda56dd /source/core/slang-io.cpp | |
| parent | 16613ed981fc5dc38966f5108e85b1aee36ef92f (diff) | |
Overhaul `RefPtr` and `String`
- `RefPtr` no longer tries to have distinct cases for interal-vs-external reference counts. Instead we always require an internal reference count.
- Types the used `RefPtr` but weren't `RefObject` were made to inherit `RefObject`
- The `ReferenceCounted` base class was removed, so that only `RefObject` remains
- Implicit conversion from `RefPtr<T>` to `T*` added
- This created some complicates for other types that relied on implicit conversions, so this isn't a net cleanup right now
- The main type that got messed up by the above was `String`, which previously held a `RefPtr<char, ...>`. This change thus *also* includes a major overhaul of `String`:
- `String` now holds all its data via indirection, using a `StringRepresentation` that is a `RefObject`. This object holds a length, capacity, and directly stores the character data in its allocation. This means that `sizeof(String)==sizeof(void*)`
- It is now possible to directly mutate a `String` by appending to its representation (we just need to ensure it has a reference count of `1`, possibly by cloning it). This means that `StringBuilder` is now basically just an idomatic use of `String`
- A couple operations that just return sub-ranges of a `String` now return `StringSlice` to avoid allocation when it isn't needed. This required more work.
- Indices into strings changed from `int` to `UInt` (which is pointer-sized). This had a bunch of follow-on changes because the value `-1` sometimes needs to be special-cased in code that uses indices. Further cleanups are probably needed here.
Diffstat (limited to 'source/core/slang-io.cpp')
| -rw-r--r-- | source/core/slang-io.cpp | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/source/core/slang-io.cpp b/source/core/slang-io.cpp index dc2793fc4..684fed0a1 100644 --- a/source/core/slang-io.cpp +++ b/source/core/slang-io.cpp @@ -40,24 +40,46 @@ namespace Slang sb.Append(newExt); return sb.ProduceString(); } + + static UInt findLastSeparator(String const& path) + { + UInt slashPos = path.LastIndexOf('/'); + UInt backslashPos = path.LastIndexOf('\\'); + + if (slashPos == -1) return backslashPos; + if (backslashPos == -1) return slashPos; + + UInt pos = slashPos; + if (backslashPos > slashPos) + pos = backslashPos; + + return pos; + } + String Path::GetFileName(const String & path) { - int pos = path.LastIndexOf('/'); - pos = Math::Max(path.LastIndexOf('\\'), pos) + 1; - return path.SubString(pos, path.Length()-pos); + UInt pos = findLastSeparator(path); + if (pos != -1) + { + pos = pos + 1; + return path.SubString(pos, path.Length() - pos); + } + else + { + return path; + } } String Path::GetFileNameWithoutEXT(const String & path) { - int pos = path.LastIndexOf('/'); - pos = Math::Max(path.LastIndexOf('\\'), pos) + 1; - int dotPos = path.LastIndexOf('.'); - if (dotPos <= pos) - dotPos = path.Length(); - return path.SubString(pos, dotPos - pos); + String fileName = GetFileName(path); + int dotPos = fileName.LastIndexOf('.'); + if (dotPos == -1) + return fileName; + return fileName.SubString(0, dotPos); } String Path::GetFileExt(const String & path) { - int dotPos = path.LastIndexOf('.'); + UInt dotPos = path.LastIndexOf('.'); if (dotPos != -1) return path.SubString(dotPos+1, path.Length()-dotPos-1); else @@ -65,8 +87,7 @@ namespace Slang } String Path::GetDirectoryName(const String & path) { - int pos = path.LastIndexOf('/'); - pos = Math::Max(path.LastIndexOf('\\'), pos); + UInt pos = findLastSeparator(path); if (pos != -1) return path.SubString(0, pos); else |
