Skip to content

Commit

Permalink
Temporarily break ABI for fmt::detail::get_file.
Browse files Browse the repository at this point in the history
* Temporary patch to resolve swift compiler crash
  on this symbol.
  • Loading branch information
furby-tm committed Feb 9, 2024
1 parent 751bd2d commit 6a16805
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 105 deletions.
4 changes: 4 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,10 @@ let package = Package(
.headerSearchPath("."),
.headerSearchPath("include/OpenImageIO/detail"),
.headerSearchPath("libOpenImageIO"),
// FIXME: We broke the ABI for fmt::detail::get_file
// to stop the swift compiler from crashing at this
// function, we should fix this in the future.
//.define("OIIO_FIX_ABI_FOR_SWIFT", to: "1"),
],
linkerSettings: getConfig(for: .oiio).linkerSettings
),
Expand Down
108 changes: 48 additions & 60 deletions Sources/OpenImageIO/include/OpenImageIO/OpenImageIO.h
Original file line number Diff line number Diff line change
@@ -1,68 +1,56 @@
#ifndef __OPENIMAGEIO_H__
#define __OPENIMAGEIO_H__

// TODO: swift hates this include (OpenImageIO/detail/fmt.h) with an error in the form of:
// 1. Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5)
// 2. Compiling with the current language version
// 3. /Users/furby/Wabi/MetaverseKit/Sources/OpenImageIO/include/OpenImageIO/detail/fmt/ostream.h:32:7: importing 'fmt::detail::file_access'
// 4. /Users/furby/Wabi/MetaverseKit/Sources/OpenImageIO/include/OpenImageIO/detail/fmt/ostream.h:32:7: importing 'fmt::detail::file_access'
// 5. /Users/furby/Wabi/MetaverseKit/Sources/OpenImageIO/include/OpenImageIO/detail/fmt/ostream.h:33:15: importing 'fmt::detail::get_file'

// In the meantime, leave the OpenImageIO import stubbed out
// so a developer can begin slotting in headers to fill the
// swift api as needed.

#include <OpenImageIO/oiioversion.h>
#include <OpenImageIO/version.h>
#include <OpenImageIO/half.h>

// #include <OpenImageIO/argparse.h>
// #include <OpenImageIO/array_view.h>
// #include <OpenImageIO/atomic.h>
// #include <OpenImageIO/attrdelegate.h>
// #include <OpenImageIO/benchmark.h>
// #include <OpenImageIO/color.h>
// #include <OpenImageIO/dassert.h>
// #include <OpenImageIO/deepdata.h>
// #include <OpenImageIO/errorhandler.h>
// #include <OpenImageIO/export.h>
// #include <OpenImageIO/filesystem.h>
// #include <OpenImageIO/filter.h>
// #include <OpenImageIO/fmath.h>
// #include <OpenImageIO/fstream_mingw.h>
// #include <OpenImageIO/function_view.h>
// #include <OpenImageIO/hash.h>
// #include <OpenImageIO/image_view.h>
// #include <OpenImageIO/imagebuf.h>
// #include <OpenImageIO/imagebufalgo.h>
// #include <OpenImageIO/imagebufalgo_util.h>
// #include <OpenImageIO/imagecache.h>
// #include <OpenImageIO/imageio.h>
// #include <OpenImageIO/missing_math.h>
// #include <OpenImageIO/oiioversion.h>
// #include <OpenImageIO/optparser.h>
// #include <OpenImageIO/parallel.h>
// #include <OpenImageIO/paramlist.h>
// #include <OpenImageIO/platform.h>
// #include <OpenImageIO/plugin.h>
// #include <OpenImageIO/refcnt.h>
// #include <OpenImageIO/simd.h>
// #include <OpenImageIO/span.h>
// #include <OpenImageIO/strided_ptr.h>
// #include <OpenImageIO/string_view.h>
// #include <OpenImageIO/strongparam.h>
// #include <OpenImageIO/strutil.h>
// #include <OpenImageIO/sysutil.h>
// #include <OpenImageIO/texture.h>
// #include <OpenImageIO/thread.h>
// #include <OpenImageIO/tiffutils.h>
// #include <OpenImageIO/timer.h>
// #include <OpenImageIO/type_traits.h>
// #include <OpenImageIO/typedesc.h>
// #include <OpenImageIO/unittest.h>
// #include <OpenImageIO/unordered_map_concurrent.h>
// #include <OpenImageIO/ustring.h>
// #include <OpenImageIO/varyingref.h>
// #include <OpenImageIO/vecparam.h>
#include <OpenImageIO/argparse.h>
#include <OpenImageIO/array_view.h>
#include <OpenImageIO/atomic.h>
#include <OpenImageIO/attrdelegate.h>
#include <OpenImageIO/benchmark.h>
#include <OpenImageIO/color.h>
#include <OpenImageIO/dassert.h>
#include <OpenImageIO/deepdata.h>
#include <OpenImageIO/errorhandler.h>
#include <OpenImageIO/export.h>
#include <OpenImageIO/filesystem.h>
#include <OpenImageIO/filter.h>
#include <OpenImageIO/fmath.h>
#include <OpenImageIO/fstream_mingw.h>
#include <OpenImageIO/function_view.h>
#include <OpenImageIO/hash.h>
#include <OpenImageIO/image_view.h>
#include <OpenImageIO/imagebuf.h>
#include <OpenImageIO/imagebufalgo.h>
#include <OpenImageIO/imagebufalgo_util.h>
#include <OpenImageIO/imagecache.h>
#include <OpenImageIO/imageio.h>
#include <OpenImageIO/missing_math.h>
#include <OpenImageIO/oiioversion.h>
#include <OpenImageIO/optparser.h>
#include <OpenImageIO/parallel.h>
#include <OpenImageIO/paramlist.h>
#include <OpenImageIO/platform.h>
#include <OpenImageIO/plugin.h>
#include <OpenImageIO/refcnt.h>
#include <OpenImageIO/simd.h>
#include <OpenImageIO/span.h>
#include <OpenImageIO/strided_ptr.h>
#include <OpenImageIO/string_view.h>
#include <OpenImageIO/strongparam.h>
#include <OpenImageIO/strutil.h>
#include <OpenImageIO/sysutil.h>
#include <OpenImageIO/texture.h>
#include <OpenImageIO/thread.h>
#include <OpenImageIO/tiffutils.h>
#include <OpenImageIO/timer.h>
#include <OpenImageIO/type_traits.h>
#include <OpenImageIO/typedesc.h>
#include <OpenImageIO/unittest.h>
#include <OpenImageIO/unordered_map_concurrent.h>
#include <OpenImageIO/ustring.h>
#include <OpenImageIO/varyingref.h>
#include <OpenImageIO/vecparam.h>

#endif // __OPENIMAGEIO_H__
15 changes: 12 additions & 3 deletions Sources/OpenImageIO/include/OpenImageIO/detail/fmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ OIIO_PRAGMA_WARNING_PUSH

OIIO_PRAGMA_WARNING_POP

// At some point a method signature changed
#if FMT_VERSION >= 90000
# define OIIO_FMT_CUSTOM_FORMATTER_CONST const
#else
# define OIIO_FMT_CUSTOM_FORMATTER_CONST
#endif


OIIO_NAMESPACE_BEGIN
namespace pvt {
Expand Down Expand Up @@ -118,7 +125,8 @@ template<typename T,
OIIO_ENABLE_IF(has_subscript<T>::value&& has_size_method<T>::value)>
struct index_formatter : format_parser_with_separator {
// inherits parse() from format_parser_with_separator
template<typename FormatContext> auto format(const T& v, FormatContext& ctx)
template<typename FormatContext>
auto format(const T& v, FormatContext& ctx) OIIO_FMT_CUSTOM_FORMATTER_CONST
{
std::string vspec = elem_fmt.size() ? fmt::format("{{:{}}}", elem_fmt)
: std::string("{}");
Expand Down Expand Up @@ -162,7 +170,8 @@ struct index_formatter : format_parser_with_separator {
template<typename T, typename Elem, int Size>
struct array_formatter : format_parser_with_separator {
// inherits parse() from format_parser_with_separator
template<typename FormatContext> auto format(const T& v, FormatContext& ctx)
template<typename FormatContext>
auto format(const T& v, FormatContext& ctx) OIIO_FMT_CUSTOM_FORMATTER_CONST
{
std::string vspec = elem_fmt.size() ? fmt::format("{{:{}}}", elem_fmt)
: std::string("{}");
Expand All @@ -182,4 +191,4 @@ struct array_formatter : format_parser_with_separator {


} // namespace pvt
OIIO_NAMESPACE_END
OIIO_NAMESPACE_END
2 changes: 2 additions & 0 deletions Sources/OpenImageIO/include/OpenImageIO/detail/fmt/ostream.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ namespace detail {
namespace {
struct file_access_tag {};
} // namespace
#ifdef OIIO_FIX_ABI_FOR_SWIFT
template <typename Tag, typename BufType, FILE* BufType::*FileMemberPtr>
class file_access {
friend auto get_file(BufType& obj) -> FILE* { return obj.*FileMemberPtr; }
};
#endif /* OIIO_FIX_ABI_FOR_SWIFT */

#if FMT_MSC_VERSION
template class file_access<file_access_tag, std::filebuf,
Expand Down
3 changes: 2 additions & 1 deletion Sources/OpenImageIO/include/OpenImageIO/typedesc.h
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,8 @@ struct formatter<OIIO::TypeDesc> {
}

template <typename FormatContext>
auto format(const OIIO::TypeDesc& t, FormatContext& ctx) -> decltype(ctx.out()) const {
auto format(const OIIO::TypeDesc& t, FormatContext& ctx) OIIO_FMT_CUSTOM_FORMATTER_CONST
{
// C++14: auto format(const OIIO::TypeDesc& p, FormatContext& ctx) const {
// ctx.out() is an output iterator to write to.
return format_to(ctx.out(), "{}", t.c_str());
Expand Down
76 changes: 35 additions & 41 deletions Sources/OpenImageIO/include/OpenImageIO/ustring.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,7 @@ class OIIO_UTIL_API ustring {
}

/// Copy construct a ustring from another ustring.
ustring(const ustring& str) noexcept
: m_chars(str.m_chars)
{
}
ustring(const ustring& str) noexcept = default;

/// Construct a ustring from an indexed substring of a ustring.
ustring(const ustring& str, size_type pos, size_type n = npos)
Expand All @@ -203,7 +200,7 @@ class OIIO_UTIL_API ustring {
#endif

/// ustring destructor.
~ustring() noexcept {}
~ustring() noexcept = default;

/// Conversion to an OIIO::string_view.
operator string_view() const noexcept { return { c_str(), length() }; }
Expand All @@ -212,79 +209,75 @@ class OIIO_UTIL_API ustring {
explicit operator std::string() const noexcept { return string(); }

/// Assign a ustring to *this.
const ustring& assign(const ustring& str)
ustring& assign(const ustring& str)
{
m_chars = str.m_chars;
return *this;
}

/// Assign a substring of a ustring to *this.
const ustring& assign(const ustring& str, size_type pos, size_type n = npos)
ustring& assign(const ustring& str, size_type pos, size_type n = npos)
{
*this = ustring(str, pos, n);
return *this;
}

/// Assign a std::string to *this.
const ustring& assign(const std::string& str)
ustring& assign(const std::string& str)
{
assign(str.c_str());
return *this;
}

/// Assign a substring of a std::string to *this.
const ustring& assign(const std::string& str, size_type pos,
size_type n = npos)
ustring& assign(const std::string& str, size_type pos, size_type n = npos)
{
*this = ustring(str, pos, n);
return *this;
}

/// Assign a null-terminated C string (char*) to *this.
const ustring& assign(const char* str)
ustring& assign(const char* str)
{
m_chars = str ? make_unique(str) : nullptr;
return *this;
}

/// Assign the first n characters of str to *this.
const ustring& assign(const char* str, size_type n)
ustring& assign(const char* str, size_type n)
{
*this = ustring(str, n);
return *this;
}

/// Assign n copies of c to *this.
const ustring& assign(size_type n, char c)
ustring& assign(size_type n, char c)
{
*this = ustring(n, c);
return *this;
}

/// Assign a string_view to *this.
const ustring& assign(string_view str)
ustring& assign(string_view str)
{
m_chars = str.length() ? make_unique(str) : nullptr;
return *this;
}

/// Assign a ustring to another ustring.
const ustring& operator=(const ustring& str) { return assign(str); }
ustring& operator=(const ustring& str) noexcept = default;

/// Assign a null-terminated C string (char *) to a ustring.
const ustring& operator=(const char* str) { return assign(str); }
ustring& operator=(const char* str) { return assign(str); }

/// Assign a C++ std::string to a ustring.
const ustring& operator=(const std::string& str) { return assign(str); }
ustring& operator=(const std::string& str) { return assign(str); }

/// Assign a string_view to a ustring.
const ustring& operator=(string_view str) { return assign(str); }
ustring& operator=(string_view str) { return assign(str); }

/// Assign a single char to a ustring.
const ustring& operator=(char c)
{
return *this = ustring(string_view(&c, 1));
}
ustring& operator=(char c) { return *this = ustring(string_view(&c, 1)); }

/// Return a C string representation of a ustring.
const char* c_str() const noexcept { return m_chars; }
Expand Down Expand Up @@ -804,9 +797,10 @@ class OIIO_UTIL_API ustringhash {

/// Copy construct a ustringhash from another ustringhash.
OIIO_HOSTDEVICE constexpr ustringhash(const ustringhash& str) noexcept
: m_hash(str.m_hash)
{
}
= default;

/// Move construct a ustringhash from another ustringhash.
OIIO_HOSTDEVICE ustringhash(ustringhash&& str) noexcept = default;

/// Construct from a ustring
ustringhash(const ustring& str) noexcept
Expand Down Expand Up @@ -870,15 +864,12 @@ class OIIO_UTIL_API ustringhash {
}

/// Assign from a ustringhash
OIIO_HOSTDEVICE constexpr const ustringhash&
operator=(const ustringhash& str)
{
m_hash = str.m_hash;
return *this;
}
OIIO_HOSTDEVICE constexpr ustringhash& operator=(const ustringhash& str)
= default;
OIIO_HOSTDEVICE ustringhash& operator=(ustringhash&& str) = default;

/// Assign from a ustring
const ustringhash& operator=(const ustring& str)
ustringhash& operator=(const ustring& str)
{
m_hash = str.hash();
return *this;
Expand Down Expand Up @@ -1032,15 +1023,16 @@ inline ustring::ustring(ustringhash hash)


/// ustring string literal operator
inline ustring operator""_us(const char* str, std::size_t len)
inline ustring
operator""_us(const char* str, std::size_t len)
{
return ustring(str, len);
}


/// ustringhash string literal operator
OIIO_DEVICE_CONSTEXPR ustringhash operator""_ush(const char* str,
std::size_t len)
OIIO_DEVICE_CONSTEXPR ustringhash
operator""_ush(const char* str, std::size_t len)
{
return ustringhash(str, len);
}
Expand All @@ -1051,7 +1043,9 @@ OIIO_DEVICE_CONSTEXPR ustringhash operator""_ush(const char* str,
/// Deprecated -- This is too easy to confuse with the ustringhash class. And
/// also it is unnecessary if you use std::hash<ustring>. This will be removed
/// in OIIO 3.0.
using ustringHash = std::hash<ustring>;
using ustringHash
OIIO_DEPRECATED("Use std::hash<ustring> instead of ustringHash")
= std::hash<ustring>;
#endif


Expand Down Expand Up @@ -1160,8 +1154,8 @@ FMT_BEGIN_NAMESPACE

template<> struct formatter<OIIO::ustring> : formatter<fmt::string_view, char> {
template<typename FormatContext>
auto format(const OIIO::ustring& u, FormatContext& ctx)
-> decltype(ctx.out()) const
auto format(const OIIO::ustring& u,
FormatContext& ctx) OIIO_FMT_CUSTOM_FORMATTER_CONST
{
return formatter<fmt::string_view, char>::format({ u.data(), u.size() },
ctx);
Expand All @@ -1171,13 +1165,13 @@ template<> struct formatter<OIIO::ustring> : formatter<fmt::string_view, char> {
template<>
struct formatter<OIIO::ustringhash> : formatter<fmt::string_view, char> {
template<typename FormatContext>
auto format(const OIIO::ustringhash& h, FormatContext& ctx)
-> decltype(ctx.out()) const
auto format(const OIIO::ustringhash& h,
FormatContext& ctx) OIIO_FMT_CUSTOM_FORMATTER_CONST
{
OIIO::ustring u(h);
return formatter<fmt::string_view, char>::format({ u.data(), u.size() },
ctx);
}
};

FMT_END_NAMESPACE
FMT_END_NAMESPACE

0 comments on commit 6a16805

Please sign in to comment.