Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support compiling {fmt} as named module #2235

Merged
merged 1 commit into from
Apr 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions include/fmt/chrono.h
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,8 @@ inline null<> gmtime_r(...) { return null<>(); }
inline null<> gmtime_s(...) { return null<>(); }
} // namespace detail

FMT_MODULE_EXPORT_BEGIN

/**
Converts given time since epoch as ``std::time_t`` value into calendar time,
expressed in local time. Unlike ``std::localtime``, this function is
Expand Down Expand Up @@ -380,6 +382,8 @@ inline std::tm gmtime(
return gmtime(std::chrono::system_clock::to_time_t(time_point));
}

FMT_MODULE_EXPORT_END

namespace detail {
inline size_t strftime(char* str, size_t count, const char* format,
const std::tm* time) {
Expand All @@ -401,6 +405,8 @@ inline size_t strftime(wchar_t* str, size_t count, const wchar_t* format,
}
} // namespace detail

FMT_MODULE_EXPORT_BEGIN

template <typename Char, typename Duration>
struct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,
Char> : formatter<std::tm, Char> {
Expand Down Expand Up @@ -1185,6 +1191,7 @@ struct formatter<std::chrono::duration<Rep, Period>, Char> {
}
};

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_CHRONO_H_
6 changes: 6 additions & 0 deletions include/fmt/color.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#endif

FMT_BEGIN_NAMESPACE
FMT_MODULE_EXPORT_BEGIN

enum class color : uint32_t {
alice_blue = 0xF0F8FF, // rgb(240,248,255)
Expand Down Expand Up @@ -205,6 +206,7 @@ struct rgb {
uint8_t b;
};

FMT_MODULE_EXPORT_END
namespace detail {

// color is a struct of either a rgb color or a terminal color.
Expand All @@ -229,6 +231,7 @@ struct color_type {
} value;
};
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

/** A text style consisting of foreground and background colors and emphasis. */
class text_style {
Expand Down Expand Up @@ -367,6 +370,7 @@ FMT_CONSTEXPR inline text_style operator|(emphasis lhs,
return text_style(lhs) | rhs;
}

FMT_MODULE_EXPORT_END
namespace detail {

template <typename Char> struct ansi_color_escape {
Expand Down Expand Up @@ -510,6 +514,7 @@ void vformat_to(buffer<Char>& buf, const text_style& ts,
if (has_style) detail::reset_color<Char>(buf);
}
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

template <typename S, typename Char = char_t<S>>
void vprint(std::FILE* f, const text_style& ts, const S& format,
Expand Down Expand Up @@ -619,6 +624,7 @@ inline auto format_to(OutputIt out, const text_style& ts, const S& format_str,
fmt::make_args_checked<Args...>(format_str, args...));
}

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_COLOR_H_
3 changes: 3 additions & 0 deletions include/fmt/compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,8 @@ FMT_DEPRECATED auto compile(const Args&... args)
return detail::compile(args...);
}

FMT_MODULE_EXPORT_BEGIN

#if FMT_USE_CONSTEXPR
# ifdef __cpp_if_constexpr

Expand Down Expand Up @@ -953,6 +955,7 @@ operator""_cf() {
} // namespace literals
#endif

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_COMPILE_H_
26 changes: 26 additions & 0 deletions include/fmt/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,16 @@
FMT_INLINE_NAMESPACE v7 {
#endif

#ifndef FMT_MODULE_EXPORT
# define FMT_MODULE_EXPORT
#endif
#ifndef FMT_MODULE_EXPORT_BEGIN
# define FMT_MODULE_EXPORT_BEGIN
#endif
#ifndef FMT_MODULE_EXPORT_END
# define FMT_MODULE_EXPORT_END
#endif

#if !defined(FMT_HEADER_ONLY) && defined(_WIN32)
# define FMT_CLASS_API FMT_MSC_WARNING(suppress : 4275)
# ifdef FMT_EXPORT
Expand Down Expand Up @@ -370,6 +380,8 @@ namespace internal = detail; // DEPRECATED
compiled with a different ``-std`` option than the client code (which is not
recommended).
*/
FMT_MODULE_EXPORT_BEGIN

template <typename Char> class basic_string_view {
private:
const Char* data_;
Expand Down Expand Up @@ -523,6 +535,7 @@ constexpr basic_string_view<typename S::char_type> to_string_view(const S& s) {
return s;
}

FMT_MODULE_EXPORT_END
namespace detail {
void to_string_view(...);
using fmt::v7::to_string_view;
Expand Down Expand Up @@ -560,6 +573,7 @@ struct error_handler {
FMT_NORETURN FMT_API void on_error(const char* message);
};
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

/** String's character type. */
template <typename S> using char_t = typename detail::char_t_impl<S>::type;
Expand Down Expand Up @@ -668,6 +682,7 @@ template <typename T> struct is_contiguous : std::false_type {};
template <typename Char>
struct is_contiguous<std::basic_string<Char>> : std::true_type {};

FMT_MODULE_EXPORT_END
namespace detail {

// Extracts a reference to the container from back_insert_iterator.
Expand Down Expand Up @@ -1285,6 +1300,7 @@ enum { max_packed_args = 62 / packed_arg_bits };
enum : unsigned long long { is_unpacked_bit = 1ULL << 63 };
enum : unsigned long long { has_named_args_bit = 1ULL << 62 };
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

// A formatting argument. It is a trivially copyable/constructible type to
// allow storage in basic_memory_buffer.
Expand Down Expand Up @@ -1394,6 +1410,7 @@ FMT_CONSTEXPR_DECL FMT_INLINE auto visit_format_arg(
return vis(monostate());
}

FMT_MODULE_EXPORT_END
namespace detail {

#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500
Expand Down Expand Up @@ -1480,6 +1497,7 @@ inline basic_format_arg<Context> make_arg(const T& value) {
return make_arg<Context>(value);
}
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

// Formatting context.
template <typename OutputIt, typename Char> class basic_format_context {
Expand Down Expand Up @@ -1536,10 +1554,14 @@ using buffer_context =
using format_context = buffer_context<char>;
using wformat_context = buffer_context<wchar_t>;

FMT_MODULE_EXPORT_END

// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164.
#define FMT_BUFFER_CONTEXT(Char) \
basic_format_context<detail::buffer_appender<Char>, Char>

FMT_MODULE_EXPORT_BEGIN

template <typename T, typename Char = char>
using is_formattable = bool_constant<!std::is_same<
decltype(detail::arg_mapper<buffer_context<Char>>().map(std::declval<T>())),
Expand Down Expand Up @@ -1782,6 +1804,7 @@ struct wformat_args : basic_format_args<wformat_context> {
};
#endif

FMT_MODULE_EXPORT_END
namespace detail {

template <typename Char, FMT_ENABLE_IF(!std::is_same<Char, char>::value)>
Expand All @@ -1806,6 +1829,7 @@ FMT_API void vprint_mojibake(std::FILE*, string_view, format_args);
inline void vprint_mojibake(std::FILE*, string_view, format_args) {}
#endif
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

/** Formats a string and writes the output to ``out``. */
// GCC 8 and earlier cannot handle std::back_insert_iterator<Container> with
Expand Down Expand Up @@ -1954,6 +1978,8 @@ inline void print(const S& format_str, Args&&... args) {
: detail::vprint_mojibake(stdout, to_string_view(format_str),
vargs);
}

FMT_MODULE_EXPORT_END
FMT_GCC_PRAGMA("GCC pop_options")
FMT_END_NAMESPACE

Expand Down
15 changes: 14 additions & 1 deletion include/fmt/format.h
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,8 @@ void iterator_buffer<OutputIt, T, Traits>::flush() {
}
} // namespace detail

FMT_MODULE_EXPORT_BEGIN

// The number of characters to store in the basic_memory_buffer object itself
// to avoid dynamic memory allocation.
enum { inline_buffer_size = 500 };
Expand Down Expand Up @@ -859,6 +861,7 @@ class FMT_API format_error : public std::runtime_error {
~format_error() FMT_NOEXCEPT FMT_OVERRIDE;
};

FMT_MODULE_EXPORT_END
namespace detail {

template <typename T>
Expand Down Expand Up @@ -1255,7 +1258,7 @@ template <typename Char> struct fill_t {
}
};
} // namespace detail

FMT_MODULE_EXPORT_BEGIN
// We cannot use enum classes as bit fields because of a gcc bug
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414.
namespace align {
Expand Down Expand Up @@ -1291,6 +1294,7 @@ template <typename Char> struct basic_format_specs {

using format_specs = basic_format_specs<char>;

FMT_MODULE_EXPORT_END
namespace detail {
namespace dragonbox {

Expand Down Expand Up @@ -3305,6 +3309,7 @@ FMT_API void format_error_code(buffer<char>& out, int error_code,
FMT_API void report_error(format_func func, int error_code,
string_view message) FMT_NOEXCEPT;
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

template <typename OutputIt, typename Char>
using arg_formatter FMT_DEPRECATED_ALIAS =
Expand Down Expand Up @@ -3833,6 +3838,8 @@ std::basic_string<Char> to_string(const basic_memory_buffer<Char, SIZE>& buf) {
return std::basic_string<Char>(buf.data(), size);
}

FMT_MODULE_EXPORT_END

template <typename Char>
void detail::vformat_to(
detail::buffer<Char>& buf, basic_string_view<Char> format_str,
Expand Down Expand Up @@ -3881,6 +3888,8 @@ extern template int snprintf_float<long double>(long double value,
} // namespace detail
#endif

FMT_MODULE_EXPORT_BEGIN

template <typename S, typename Char = char_t<S>,
FMT_ENABLE_IF(detail::is_string<S>::value)>
inline void vformat_to(
Expand Down Expand Up @@ -3965,6 +3974,7 @@ void vprint(basic_string_view<Char> format_str, wformat_args args) {
vprint(stdout, format_str, args);
}

FMT_MODULE_EXPORT_END
#if FMT_USE_USER_DEFINED_LITERALS
namespace detail {
template <typename Char> struct udl_formatter {
Expand All @@ -3984,6 +3994,7 @@ template <typename Char> struct udl_arg {
}
};
} // namespace detail
FMT_MODULE_EXPORT_BEGIN

inline namespace literals {
/**
Expand Down Expand Up @@ -4022,6 +4033,8 @@ constexpr detail::udl_arg<wchar_t> operator"" _a(const wchar_t* s, size_t) {
return {s};
}
} // namespace literals

FMT_MODULE_EXPORT_END
#endif // FMT_USE_USER_DEFINED_LITERALS
FMT_END_NAMESPACE

Expand Down
3 changes: 3 additions & 0 deletions include/fmt/locale.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ std::basic_string<Char> vformat(
}
} // namespace detail

FMT_MODULE_EXPORT_BEGIN

template <typename S, typename Char = char_t<S>>
inline std::basic_string<Char> vformat(
const std::locale& loc, const S& format_str,
Expand Down Expand Up @@ -59,6 +61,7 @@ inline auto format_to(OutputIt out, const std::locale& loc, const S& format_str,
return vformat_to(out, loc, to_string_view(format_str), vargs);
}

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_LOCALE_H_
6 changes: 6 additions & 0 deletions include/fmt/ostream.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@

FMT_BEGIN_NAMESPACE

FMT_MODULE_EXPORT_BEGIN

template <typename Char> class basic_printf_parse_context;
template <typename OutputIt, typename Char> class basic_printf_context;

FMT_MODULE_EXPORT_END

namespace detail {

template <class Char> class formatbuf : public std::basic_streambuf<Char> {
Expand Down Expand Up @@ -151,6 +155,7 @@ struct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>
};
} // namespace detail

FMT_MODULE_EXPORT
template <typename Char>
void vprint(std::basic_ostream<Char>& os, basic_string_view<Char> format_str,
basic_format_args<buffer_context<type_identity_t<Char>>> args) {
Expand All @@ -168,6 +173,7 @@ void vprint(std::basic_ostream<Char>& os, basic_string_view<Char> format_str,
fmt::print(cerr, "Don't {}!", "panic");
\endrst
*/
FMT_MODULE_EXPORT
template <typename S, typename... Args,
typename Char = enable_if_t<detail::is_string<S>::value, char_t<S>>>
void print(std::basic_ostream<Char>& os, const S& format_str, Args&&... args) {
Expand Down
5 changes: 5 additions & 0 deletions include/fmt/printf.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ FMT_DEPRECATED void printf(detail::buffer<Char>& buf,
}
using detail::vprintf;

// already exported through "ostream.h" above
template <typename Char>
class basic_printf_parse_context : public basic_format_parse_context<Char> {
using basic_format_parse_context<Char>::basic_format_parse_context;
Expand Down Expand Up @@ -567,6 +568,8 @@ OutputIt basic_printf_context<OutputIt, Char>::format() {
out, basic_string_view<Char>(start, detail::to_unsigned(it - start)));
}

FMT_MODULE_EXPORT_BEGIN

template <typename Char>
using basic_printf_context_t =
basic_printf_context<detail::buffer_appender<Char>, Char>;
Expand Down Expand Up @@ -717,6 +720,8 @@ inline int fprintf(std::basic_ostream<Char>& os, const S& format_str,
return vfprintf(os, to_string_view(format_str),
make_format_args<context>(args...));
}

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_PRINTF_H_
3 changes: 3 additions & 0 deletions include/fmt/ranges.h
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,8 @@ struct formatter<tuple_arg_join<Char, T...>, Char> {
}
};

FMT_MODULE_EXPORT_BEGIN

/**
\rst
Returns an object that formats `tuple` with elements separated by `sep`.
Expand Down Expand Up @@ -468,6 +470,7 @@ arg_join<const T*, const T*, wchar_t> join(std::initializer_list<T> list,
return join(std::begin(list), std::end(list), sep);
}

FMT_MODULE_EXPORT_END
FMT_END_NAMESPACE

#endif // FMT_RANGES_H_