diff --git a/Src/IACore/imp/inl/IACore/StreamReader/Interface/StreamReader.interface.inl b/Src/IACore/imp/inl/IACore/StreamReader/Interface/StreamReader.interface.inl index 9e79dcd..94c9a80 100644 --- a/Src/IACore/imp/inl/IACore/StreamReader/Interface/StreamReader.interface.inl +++ b/Src/IACore/imp/inl/IACore/StreamReader/Interface/StreamReader.interface.inl @@ -16,13 +16,16 @@ #pragma once +#include +#include + namespace ia { class IStreamReader { public: - STATIC SharedPtr Create(IN PCCHAR filePath); - STATIC SharedPtr Create(IN Vector &&data); + STATIC RefPtr Create(IN PCCHAR filePath); + STATIC RefPtr Create(IN Vector &&data); public: PURE_VIRTUAL(BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST); @@ -44,20 +47,20 @@ namespace ia class MemoryStreamReader : public IStreamReader { public: - STATIC SharedPtr Create(IN Vector &&data); + STATIC INLINE RefPtr Create(IN Vector &&data); public: - BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST; + INLINE BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST; - Vector Read(); - Vector Read(IN INT64 size); - VOID Read(IN INT64 size, IN PUINT8 buffer); - Vector ReadAndInflate(IN INT64 size); + INLINE Vector Read(); + INLINE Vector Read(IN INT64 size); + INLINE VOID Read(IN INT64 size, IN PUINT8 buffer); + INLINE Vector ReadAndInflate(IN INT64 size); - UINT8 Read8(); - UINT16 Read16(); - UINT32 Read32(); - UINT64 Read64(); + INLINE UINT8 Read8(); + INLINE UINT16 Read16(); + INLINE UINT32 Read32(); + INLINE UINT64 Read64(); VOID Skip(IN INT64 size) { @@ -79,28 +82,28 @@ namespace ia Vector m_buffer; private: - MemoryStreamReader(IN Vector &&data); + INLINE MemoryStreamReader(IN Vector &&data); }; class FileStreamReader : public IStreamReader { public: - STATIC SharedPtr Create(IN PCCHAR filePath); + STATIC INLINE RefPtr Create(IN PCCHAR filePath); - ~FileStreamReader(); + INLINE ~FileStreamReader(); public: - BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST; + INLINE BOOL CompareBytes(IN PCUINT8 data, IN INT64 length) CONST; - Vector Read(); - Vector Read(IN INT64 size); - VOID Read(IN INT64 size, IN PUINT8 buffer); - Vector ReadAndInflate(IN INT64 size); + INLINE Vector Read(); + INLINE Vector Read(IN INT64 size); + INLINE VOID Read(IN INT64 size, IN PUINT8 buffer); + INLINE Vector ReadAndInflate(IN INT64 size); - UINT8 Read8(); - UINT16 Read16(); - UINT32 Read32(); - UINT64 Read64(); + INLINE UINT8 Read8(); + INLINE UINT16 Read16(); + INLINE UINT32 Read32(); + INLINE UINT64 Read64(); VOID Skip(IN INT64 size) { @@ -121,15 +124,15 @@ namespace ia FILE *m_filePtr{}; private: - FileStreamReader(IN PCCHAR filePath); + INLINE FileStreamReader(IN PCCHAR filePath); }; - SharedPtr IStreamReader::Create(IN PCCHAR filePath) + INLINE RefPtr IStreamReader::Create(IN PCCHAR filePath) { return FileStreamReader::Create(filePath); } - SharedPtr IStreamReader::Create(IN Vector &&data) + INLINE RefPtr IStreamReader::Create(IN Vector &&data) { return MemoryStreamReader::Create(std::move(data)); } diff --git a/Src/IACore/imp/inl/IACore/StreamReader/StreamReader.inl b/Src/IACore/imp/inl/IACore/StreamReader/StreamReader.inl index eb85b09..aaca260 100644 --- a/Src/IACore/imp/inl/IACore/StreamReader/StreamReader.inl +++ b/Src/IACore/imp/inl/IACore/StreamReader/StreamReader.inl @@ -20,7 +20,7 @@ namespace ia { - SharedPtr MemoryStreamReader::Create(IN Vector &&data) + RefPtr MemoryStreamReader::Create(IN Vector &&data) { struct make_shared_enabler : public MemoryStreamReader { @@ -39,7 +39,7 @@ namespace ia BOOL MemoryStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) const { - DXF_ASSERT((m_cursor + length) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + length) <= m_buffer.size()); return !memcmp(&m_buffer[m_cursor], data, length); } @@ -61,26 +61,20 @@ namespace ia VOID MemoryStreamReader::Read(IN INT64 size, IN PUINT8 buffer) { - DXF_ASSERT((m_cursor + size) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + size) <= m_buffer.size()); memcpy_s(buffer, size, &m_buffer[m_cursor], size); m_cursor += size; } - Vector MemoryStreamReader::ReadAndInflate(IN INT64 size) - { - const auto d = Read(size); - return Inflate(d.data(), d.size()); - } - UINT8 MemoryStreamReader::Read8() { - DXF_ASSERT((m_cursor + 1) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + 1) <= m_buffer.size()); return m_buffer[m_cursor++]; } UINT16 MemoryStreamReader::Read16() { - DXF_ASSERT((m_cursor + 2) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + 2) <= m_buffer.size()); const auto r = *reinterpret_cast(&m_buffer[m_cursor]); m_cursor += 2; return r; @@ -88,7 +82,7 @@ namespace ia UINT32 MemoryStreamReader::Read32() { - DXF_ASSERT((m_cursor + 4) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + 4) <= m_buffer.size()); const auto r = *reinterpret_cast(&m_buffer[m_cursor]); m_cursor += 4; return r; @@ -96,7 +90,7 @@ namespace ia UINT64 MemoryStreamReader::Read64() { - DXF_ASSERT((m_cursor + 8) <= m_buffer.size()); + IA_RELEASE_ASSERT((m_cursor + 8) <= m_buffer.size()); const auto r = *reinterpret_cast(&m_buffer[m_cursor]); m_cursor += 8; return r; @@ -105,7 +99,7 @@ namespace ia namespace ia { - SharedPtr FileStreamReader::Create(IN PCCHAR filePath) + RefPtr FileStreamReader::Create(IN PCCHAR filePath) { struct make_shared_enabler : public FileStreamReader { @@ -121,7 +115,7 @@ namespace ia { fopen_s(&m_filePtr, filePath, "rb"); if (!m_filePtr) - throw RuntimeError(BuildString("No such file or directory: ", filePath)); + THROW_FILE_OPEN_READ(filePath); } FileStreamReader ::~FileStreamReader() @@ -132,78 +126,71 @@ namespace ia BOOL FileStreamReader::CompareBytes(IN PCUINT8 data, IN INT64 length) CONST { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); STATIC Vector TmpBuffer; if (TmpBuffer.size() < length) TmpBuffer.resize(length); - DXF_RELEASE_ASSERT(fread(TmpBuffer.data(), 1, length, m_filePtr) == length); + IA_RELEASE_ASSERT(fread(TmpBuffer.data(), 1, length, m_filePtr) == length); return !memcmp(TmpBuffer.data(), data, length); } Vector FileStreamReader::Read() { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); Vector result; const auto s = ftell(m_filePtr); fseek(m_filePtr, 0, SEEK_END); const auto e = ftell(m_filePtr); fseek(m_filePtr, s, SEEK_SET); result.resize(e - s); - DXF_RELEASE_ASSERT(fread(result.data(), 1, result.size(), m_filePtr) == result.size()); + IA_RELEASE_ASSERT(fread(result.data(), 1, result.size(), m_filePtr) == result.size()); return result; } Vector FileStreamReader::Read(IN INT64 size) { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); Vector result; result.resize(size); - DXF_RELEASE_ASSERT(fread(result.data(), 1, size, m_filePtr) == size); + IA_RELEASE_ASSERT(fread(result.data(), 1, size, m_filePtr) == size); return result; } VOID FileStreamReader::Read(IN INT64 size, IN PUINT8 buffer) { - DXF_RELEASE_ASSERT(m_filePtr); - DXF_RELEASE_ASSERT(fread(buffer, 1, size, m_filePtr) == size); - } - - Vector FileStreamReader::ReadAndInflate(IN INT64 size) - { - DXF_RELEASE_ASSERT(m_filePtr); - const auto d = Read(size); - return Inflate(d.data(), d.size()); + IA_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(fread(buffer, 1, size, m_filePtr) == size); } UINT8 FileStreamReader::Read8() { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); UINT8 result; - DXF_RELEASE_ASSERT(fread(&result, 1, 1, m_filePtr) == 1); + IA_RELEASE_ASSERT(fread(&result, 1, 1, m_filePtr) == 1); return result; } UINT16 FileStreamReader::Read16() { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); UINT16 result; - DXF_RELEASE_ASSERT(fread(&result, 2, 1, m_filePtr) == 1); + IA_RELEASE_ASSERT(fread(&result, 2, 1, m_filePtr) == 1); return result; } UINT32 FileStreamReader::Read32() { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); UINT32 result; - DXF_RELEASE_ASSERT(fread(&result, 4, 1, m_filePtr) == 1); + IA_RELEASE_ASSERT(fread(&result, 4, 1, m_filePtr) == 1); return result; } UINT64 FileStreamReader::Read64() { - DXF_RELEASE_ASSERT(m_filePtr); + IA_RELEASE_ASSERT(m_filePtr); UINT64 result; - DXF_RELEASE_ASSERT(fread(&result, 8, 1, m_filePtr) == 1); + IA_RELEASE_ASSERT(fread(&result, 8, 1, m_filePtr) == 1); return result; } } // namespace ia \ No newline at end of file diff --git a/Src/IACore/imp/inl/IACore/memory/allocator/general.inl b/Src/IACore/imp/inl/IACore/memory/allocator/general.inl index 36371b3..dfb64de 100644 --- a/Src/IACore/imp/inl/IACore/memory/allocator/general.inl +++ b/Src/IACore/imp/inl/IACore/memory/allocator/general.inl @@ -47,7 +47,7 @@ namespace ia UNUSED(hint); const size_type size = (sizeof(value_type) * count); const auto ptr = reinterpret_cast(_ia_malloc(size + alignment + sizeof(PVOID))); - const auto aligned_ptr = reinterpret_cast(ptr + sizeof(PVOID) + alignment - (ptr % alignment)); + const auto aligned_ptr = (size_type)(ptr + sizeof(PVOID) + alignment - (ptr % alignment)); *(reinterpret_cast(aligned_ptr-sizeof(PVOID))) = ptr; return reinterpret_cast(aligned_ptr); } diff --git a/Src/IACore/imp/inl/IACore/stream/interface/stringstream.interface.inl b/Src/IACore/imp/inl/IACore/stream/interface/stringstream.interface.inl index 1efbe05..9fc1619 100644 --- a/Src/IACore/imp/inl/IACore/stream/interface/stringstream.interface.inl +++ b/Src/IACore/imp/inl/IACore/stream/interface/stringstream.interface.inl @@ -38,6 +38,11 @@ namespace ia StringStream& operator<<(IN CONST String& v) { m_impl << v.c_str(); return *this; } + VOID clear() + { + m_impl.clear(); + } + private: std::stringstream m_impl; }; diff --git a/Src/IACore/imp/inl/IACore/string/string.inl b/Src/IACore/imp/inl/IACore/string/string.inl index 7631644..3cb69af 100644 --- a/Src/IACore/imp/inl/IACore/string/string.inl +++ b/Src/IACore/imp/inl/IACore/string/string.inl @@ -276,7 +276,11 @@ namespace ia const auto count = last - first; res.reserve((count/stride) + 2); const auto end = start + count + 1; - for(size_type i = start; i < end; i += stride) new (&res.m_data[res.m_count++]) value_type(Base::m_data[i]); + for(size_type i = start; i < end; i += stride) + { + new (&res.m_data[res.m_count++]) value_type(Base::m_data[i]); + if(!Base::m_data[i]) break; + } res.back() = '\0'; return IA_MOVE(res); } diff --git a/Src/IACore/inc/hpp/IACore/Definitions.hpp b/Src/IACore/inc/hpp/IACore/Definitions.hpp index 02ad0ac..58767f5 100644 --- a/Src/IACore/inc/hpp/IACore/Definitions.hpp +++ b/Src/IACore/inc/hpp/IACore/Definitions.hpp @@ -27,12 +27,6 @@ #include #include -#if defined (_MSC_VER ) -#if !defined(__clang__) -#error "IA software does not support compilation with MSVC. Please use Clang on Windows platforms." -#endif -#endif - #define IAC_SEC_LEVEL(v) (IACORE_SECURITY_LEVEL >= v) #define IA_DEFINED_TRUE(o) (defined(o) && (o > 0)) @@ -155,6 +149,20 @@ #define IA_MAX_POSSIBLE_SIZE (static_cast(0x7FFFFFFFFFFFF)) #define IA_MAX_STRING_LENGTH (IA_MAX_POSSIBLE_SIZE >> 8) +#define IA_VERSION_TYPE UINT64 +#define IA_MAKE_VERSION(major, minor, patch) ((static_cast(major) & 0xFFFFFF) << 40) | ((static_cast(minor) & 0xFFFFFF) << 16) | (static_cast(patch) & 0xFFFF) + +#if defined(_MSC_VER) + #define IA_DLL_EXPORT __declspec(dllexport) + #define IA_DLL_IMPORT __declspec(dllimport) +#elif defined(__GNUC__) + #define IA_DLL_EXPORT __attribute__((visibility("default"))) + #define IA_DLL_IMPORT +#else + #define IA_DLL_EXPORT + #define IA_DLL_IMPORT +#endif + #define __CC_BLACK "\033[30m" #define __CC_RED "\033[31m" #define __CC_GREEN "\033[32m" diff --git a/Src/IACore/inc/hpp/IACore/Exception.hpp b/Src/IACore/inc/hpp/IACore/Exception.hpp index 39fad19..0cbb5dc 100644 --- a/Src/IACore/inc/hpp/IACore/Exception.hpp +++ b/Src/IACore/inc/hpp/IACore/Exception.hpp @@ -16,7 +16,7 @@ #pragma once -#include +#include namespace ia { enum class ExceptionKind { @@ -131,7 +131,9 @@ private: DO(SECURITY_BYPASS) #define DEFINE_THROWER(name) \ template NORETURN VOID THROW_##name(Args... args) { \ - throw RuntimeException(ExceptionKind::name, BuildString(args...)); \ + const auto msg = BuildString(args...); \ + Logger::Error("EXCEPT", "(", #name, "): ", msg); \ + throw RuntimeException(ExceptionKind::name, msg); \ } FOR_EACH_RUNTIME_EXCEPT_TYPE(DEFINE_THROWER); #undef DEFINE_THROWER diff --git a/Src/IACore/inc/hpp/IACore/File.hpp b/Src/IACore/inc/hpp/IACore/File.hpp index 7f489c6..7f2fa5c 100644 --- a/Src/IACore/inc/hpp/IACore/File.hpp +++ b/Src/IACore/inc/hpp/IACore/File.hpp @@ -121,10 +121,10 @@ namespace ia if constexpr (includeExtension) return path.slice(t + 1, path.end()); - return path.slice(t + 1, path.begin() + (path.rfind('.') - t) - 1); + return path.slice(t + 1, path.rfind('.')); } - String ExtractDirectoryFromPath(IN CONST String &path) + template STATIC String ExtractDirectoryFromPath(IN CONST String &path) { constexpr char pathDelimiter = '/'; @@ -132,7 +132,10 @@ namespace ia if (t == path.end()) return "./"; - return path.slice(0, t + 1); + if CONSTEXPR (includeTrailingSlash) + return path.slice(path.begin(), t + 1); + else + return path.slice(path.begin(), t); } private: diff --git a/Src/IACore/inc/hpp/IACore/Logger.hpp b/Src/IACore/inc/hpp/IACore/Logger.hpp index 0eb0551..086830d 100644 --- a/Src/IACore/inc/hpp/IACore/Logger.hpp +++ b/Src/IACore/inc/hpp/IACore/Logger.hpp @@ -18,30 +18,57 @@ #include +#ifdef __ANDROID__ +#include +#endif + namespace ia { class Logger { public: - template STATIC VOID Info(Args... args) + template STATIC VOID Info(PCCHAR tag, Args... args) { StringStream ss; UNUSED((ss << ... << args)); - printf("\033[32m[INFO]: %s\033[39m\n", ss.str().c_str()); +#ifdef __ANDROID__ + __android_log_print(ANDROID_LOG_DEBUG, "IAApp", ss.str().c_str()); +#else + printf("\033[0;37m[INFO]: [%s] %s\033[39m\n", tag, ss.str().c_str()); +#endif } - template STATIC VOID Warn(Args... args) + template STATIC VOID Success(PCCHAR tag, Args... args) { StringStream ss; UNUSED((ss << ... << args)); - printf("\033[33m[WARN]: %s\033[39m\n", ss.str().c_str()); +#ifdef __ANDROID__ + __android_log_print(ANDROID_LOG_INFO, "IAApp", ss.str().c_str()); +#else + printf("\033[32m[SUCCESS]: [%s] %s\033[39m\n", tag, ss.str().c_str()); +#endif } - template STATIC VOID Error(Args... args) + template STATIC VOID Warn(PCCHAR tag, Args... args) { StringStream ss; UNUSED((ss << ... << args)); - printf("\033[31m[ERROR]: %s\033[39m\n", ss.str().c_str()); +#ifdef __ANDROID__ + __android_log_print(ANDROID_LOG_DEBUG, "IAApp", ss.str().c_str()); +#else + printf("\033[33m[WARN]: [%s] %s\033[39m\n", tag, ss.str().c_str()); +#endif + } + + template STATIC VOID Error(PCCHAR tag, Args... args) + { + StringStream ss; + UNUSED((ss << ... << args)); +#ifdef __ANDROID__ + __android_log_print(ANDROID_LOG_ERROR, "IAApp", ss.str().c_str()); +#else + printf("\033[31m[ERROR]: [%s] %s\033[39m\n", tag, ss.str().c_str()); +#endif } private: diff --git a/Src/IACoreTest/CMakeLists.txt b/Src/IACoreTest/CMakeLists.txt index 03f16c3..d92992b 100644 --- a/Src/IACoreTest/CMakeLists.txt +++ b/Src/IACoreTest/CMakeLists.txt @@ -1,8 +1,6 @@ add_executable(IACoreTest imp/cpp/Main.cpp) target_compile_options(IACoreTest PRIVATE - "-g" - "-O0" "-D__IA_DEBUG=1" ) diff --git a/Src/IACoreTest/imp/cpp/Main.cpp b/Src/IACoreTest/imp/cpp/Main.cpp index a23b074..db6b1bf 100644 --- a/Src/IACoreTest/imp/cpp/Main.cpp +++ b/Src/IACoreTest/imp/cpp/Main.cpp @@ -10,7 +10,7 @@ template VOID print(IN CONST Span<_value_type>& s) { for(const auto& v: s) - Logger::Info(v); + Logger::Info("IACore", v); } int main(int argc, char* argv[])