diff --git a/src/KKdLib/database/aet.cpp b/src/KKdLib/database/aet.cpp index 1867ef9e..f4ffdc17 100644 --- a/src/KKdLib/database/aet.cpp +++ b/src/KKdLib/database/aet.cpp @@ -16,9 +16,9 @@ static void aet_database_file_classic_read_inner(aet_database_file* aet_db, stre static void aet_database_file_classic_write_inner(aet_database_file* aet_db, stream& s); static void aet_database_file_modern_read_inner(aet_database_file* aet_db, stream& s, uint32_t header_length); static void aet_database_file_modern_write_inner(aet_database_file* aet_db, stream& s); -static int64_t aet_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); -static bool aet_database_file_strings_push_back_check(std::vector& vec, std::string& str); +static int64_t aet_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str); +static bool aet_database_file_strings_push_back_check(std::vector& vec, const std::string& str); const aet_db_aet_set aet_db_aet_set_null; const aet_db_aet aet_db_aet_null; @@ -879,20 +879,20 @@ static void aet_database_file_modern_write_inner(aet_database_file* aet_db, stre st.write(s, true, aet_db->is_x); } -inline static int64_t aet_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { +inline static int64_t aet_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return vec_off[&i - vec.data()]; return 0; } -inline static bool aet_database_file_strings_push_back_check(std::vector& vec, std::string& str) { +inline static bool aet_database_file_strings_push_back_check(std::vector& vec, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return false; diff --git a/src/KKdLib/database/object.cpp b/src/KKdLib/database/object.cpp index 6b9dde49..ec7bea53 100644 --- a/src/KKdLib/database/object.cpp +++ b/src/KKdLib/database/object.cpp @@ -16,9 +16,9 @@ static void object_database_file_classic_read_inner(object_database_file* obj_db static void object_database_file_classic_write_inner(object_database_file* obj_db, stream& s); static void object_database_file_modern_read_inner(object_database_file* obj_db, stream& s, uint32_t header_length); static void object_database_file_modern_write_inner(object_database_file* obj_db, stream& s); -static int64_t object_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); -static void object_database_strings_push_back_check(std::vector& vec, std::string& str); +static int64_t object_database_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str); +static bool object_database_strings_push_back_check(std::vector& vec, const std::string& str); object_set_info_file::object_set_info_file() : id() { @@ -568,13 +568,9 @@ static void object_database_file_classic_write_inner(object_database_file* obj_d uint32_t object_set_count = (uint32_t)obj_db->object_set.size(); - uint32_t object_count = 0; - for (object_set_info_file& i : obj_db->object_set) - object_count += (uint32_t)i.object.size(); - std::vector string_offsets; - string_offsets.reserve((int64_t)object_set_count + object_count); + string_offsets.reserve((int64_t)object_set_count * 4); uint32_t max_object_set_id = 0; uint32_t object_count = 0; @@ -833,7 +829,7 @@ static void object_database_file_modern_write_inner(object_database_file* obj_db s_mosi.write(object_count * (is_x ? 0x10ULL : 0x0CULL)); s_mosi.align_write(0x10); - std::vector strings; + std::vector strings; std::vector string_offsets; strings.reserve((int64_t)object_set_count + object_count); @@ -848,11 +844,11 @@ static void object_database_file_modern_write_inner(object_database_file* obj_db object_database_strings_push_back_check(strings, j.name); } - quicksort_string(strings.data(), strings.size()); + quicksort_string_hash(strings.data(), strings.size()); string_offsets.reserve(strings.size()); - for (std::string& i : strings) { + for (string_hash& i : strings) { string_offsets.push_back(s_mosi.get_position()); - s_mosi.write_string_null_terminated(i); + s_mosi.write_string_null_terminated(i.str); } s_mosi.align_write(0x10); @@ -932,18 +928,23 @@ static void object_database_file_modern_write_inner(object_database_file* obj_db st.write(s, true, is_x); } -inline static int64_t object_database_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { - for (std::string& i : vec) - if (str == i) +inline static int64_t object_database_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str) { + uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); + uint64_t hash_murmurhash = hash_string_murmurhash(str); + for (const string_hash& i : vec) + if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return vec_off[&i - vec.data()]; return 0; } -inline static void object_database_strings_push_back_check(std::vector& vec, std::string& str) { - for (std::string& i : vec) - if (str == i) - return; +inline static bool object_database_strings_push_back_check(std::vector& vec, const std::string& str) { + uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); + uint64_t hash_murmurhash = hash_string_murmurhash(str); + for (const string_hash& i : vec) + if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) + return false; vec.push_back(str); + return true; } diff --git a/src/KKdLib/database/sprite.cpp b/src/KKdLib/database/sprite.cpp index 959b5954..c2390107 100644 --- a/src/KKdLib/database/sprite.cpp +++ b/src/KKdLib/database/sprite.cpp @@ -16,9 +16,9 @@ static void sprite_database_file_classic_read_inner(sprite_database_file* spr_db static void sprite_database_file_classic_write_inner(sprite_database_file* spr_db, stream& s); static void sprite_database_file_modern_read_inner(sprite_database_file* spr_db, stream& s, uint32_t header_length); static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db, stream& s); -static int64_t sprite_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); -static bool sprite_database_file_strings_push_back_check(std::vector& vec, std::string& str); +static int64_t sprite_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str); +static bool sprite_database_file_strings_push_back_check(std::vector& vec, const std::string& str); const spr_db_spr_set spr_db_spr_set_null; const spr_db_spr spr_db_spr_null; @@ -943,20 +943,20 @@ static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db st.write(s, true, spr_db->is_x); } -inline static int64_t sprite_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { +inline static int64_t sprite_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return vec_off[&i - vec.data()]; return 0; } -inline static bool sprite_database_file_strings_push_back_check(std::vector& vec, std::string& str) { +inline static bool sprite_database_file_strings_push_back_check(std::vector& vec, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return false; diff --git a/src/KKdLib/database/texture.cpp b/src/KKdLib/database/texture.cpp index fafaa67a..61a84d0c 100644 --- a/src/KKdLib/database/texture.cpp +++ b/src/KKdLib/database/texture.cpp @@ -16,9 +16,9 @@ static void texture_database_file_classic_read_inner(texture_database_file* tex_ static void texture_database_file_classic_write_inner(texture_database_file* tex_db, stream& s); static void texture_database_file_modern_read_inner(texture_database_file* tex_db, stream& s, uint32_t header_length); static void texture_database_file_modern_write_inner(texture_database_file* tex_db, stream& s); -static int64_t texture_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str); -static void texture_database_file_strings_push_back_check(std::vector& vec, std::string& str); +static int64_t texture_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str); +static bool texture_database_file_strings_push_back_check(std::vector& vec, const std::string& str); texture_info_file::texture_info_file() { id = (uint32_t)-1; @@ -497,22 +497,23 @@ static void texture_database_file_modern_write_inner(texture_database_file* tex_ st.write(s, true, tex_db->is_x); } -inline static int64_t texture_database_file_strings_get_string_offset(std::vector& vec, - std::vector& vec_off, std::string& str) { +inline static int64_t texture_database_file_strings_get_string_offset(const std::vector& vec, + const std::vector& vec_off, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) return vec_off[&i - vec.data()]; return 0; } -inline static void texture_database_file_strings_push_back_check(std::vector& vec, std::string& str) { +inline static bool texture_database_file_strings_push_back_check(std::vector& vec, const std::string& str) { uint64_t hash_fnv1a64m = hash_string_fnv1a64m(str); uint64_t hash_murmurhash = hash_string_murmurhash(str); - for (string_hash& i : vec) + for (const string_hash& i : vec) if (hash_fnv1a64m == i.hash_fnv1a64m && hash_murmurhash == i.hash_murmurhash) - return; + return false; vec.push_back(str); + return true; } diff --git a/src/KKdLib/hash.hpp b/src/KKdLib/hash.hpp index 4e3071f3..bc171fb2 100644 --- a/src/KKdLib/hash.hpp +++ b/src/KKdLib/hash.hpp @@ -89,13 +89,13 @@ struct string_hash { this->hash_murmurhash = hash_string_murmurhash(this->str); } - inline string_hash(std::string& str) { + inline string_hash(const std::string& str) { this->str.assign(str); this->hash_fnv1a64m = hash_string_fnv1a64m(this->str); this->hash_murmurhash = hash_string_murmurhash(this->str); } - inline string_hash(std::string&& str) { + inline string_hash(const std::string&& str) { this->str.assign(str); this->hash_fnv1a64m = hash_string_fnv1a64m(this->str); this->hash_murmurhash = hash_string_murmurhash(this->str); diff --git a/src/KKdLib/io/stream.cpp b/src/KKdLib/io/stream.cpp index b08e92d6..32c709fc 100644 --- a/src/KKdLib/io/stream.cpp +++ b/src/KKdLib/io/stream.cpp @@ -613,38 +613,40 @@ void stream::write_double_t_reverse_endianness(double_t val, bool big_endian) { write(buf, sizeof(double_t)); } -void stream::write_string(std::string& str) { +void stream::write_string(const std::string& str) { write(str.c_str(), str.size()); } -void stream::write_string(std::string&& str) { +void stream::write_string(const std::string&& str) { write(str.c_str(), str.size()); } -void stream::write_wstring(std::wstring& str) { +void stream::write_wstring(const std::wstring& str) { write(str.c_str(), sizeof(wchar_t) * str.size()); } -void stream::write_wstring(std::wstring&& str) { +void stream::write_wstring(const std::wstring&& str) { write(str.c_str(), sizeof(wchar_t) * str.size()); } -void stream::write_string_null_terminated(std::string& str) { +void stream::write_string_null_terminated(const std::string& str) { write(str.c_str(), str.size()); write_uint8_t(0); } -void stream::write_string_null_terminated(std::string&& str) { - write_string_null_terminated(str); +void stream::write_string_null_terminated(const std::string&& str) { + write(str.c_str(), str.size()); + write_uint8_t(0); } -void stream::write_wstring_null_terminated(std::wstring& str) { +void stream::write_wstring_null_terminated(const std::wstring& str) { write(str.c_str(), sizeof(wchar_t) * str.size()); write_uint16_t(0); } -void stream::write_wstring_null_terminated(std::wstring&& str) { - write_wstring_null_terminated(*(std::wstring*)&str); +void stream::write_wstring_null_terminated(const std::wstring&& str) { + write(str.c_str(), sizeof(wchar_t) * str.size()); + write_uint16_t(0); } void stream::write_utf8_string(const char* str) { diff --git a/src/KKdLib/io/stream.hpp b/src/KKdLib/io/stream.hpp index 55d202d9..36d2cd80 100644 --- a/src/KKdLib/io/stream.hpp +++ b/src/KKdLib/io/stream.hpp @@ -125,14 +125,14 @@ public: size_t read_utf8_string_null_terminated_offset_length(int64_t offset); size_t read_utf16_string_null_terminated_offset_length(int64_t offset); - void write_string(std::string& str); - void write_string(std::string&& str); - void write_wstring(std::wstring& str); - void write_wstring(std::wstring&& str); - void write_string_null_terminated(std::string& str); - void write_string_null_terminated(std::string&& str); - void write_wstring_null_terminated(std::wstring& str); - void write_wstring_null_terminated(std::wstring&& str); + void write_string(const std::string& str); + void write_string(const std::string&& str); + void write_wstring(const std::wstring& str); + void write_wstring(const std::wstring&& str); + void write_string_null_terminated(const std::string& str); + void write_string_null_terminated(const std::string&& str); + void write_wstring_null_terminated(const std::wstring& str); + void write_wstring_null_terminated(const std::wstring&& str); void write_utf8_string(const char* str); void write_utf16_string(const wchar_t* str); void write_utf8_string_null_terminated(const char* str);