11 #include <type_traits>
21 #define FMT_HEADER_ONLY
22 #include <fmt/format.h>
95 const char *
fmt =
nullptr;
110 template<
typename...
T>
111 constexpr
bool is_type_float = (... && std::is_floating_point_v<std::decay_t<T>>);
113 template<
typename...
T>
116 template<
typename...
T>
123 #if defined(__GNUC__) && !defined(__clang__)
124 # pragma GCC diagnostic push
125 # pragma GCC diagnostic ignored "-Wformat-truncation"
127 template<
typename...
T>
135 return {
"v {:.6f} {:.6f} {:.6f} {:.4f} {:.4f} {:.4f}\n", 6,
is_type_float<
T...>};
212 template<
typename...
T>
270 #if defined(__GNUC__) && !defined(__clang__)
271 # pragma GCC diagnostic pop
281 template<eFileType filetype,
size_t buffer_chunk_size = 64 * 1024>
284 typedef std::vector<char> VectorChar;
285 std::vector<VectorChar> blocks_;
291 for (
const auto &
b : blocks_)
292 fwrite(
b.data(), 1,
b.size(), f);
299 for (
const auto &
b : blocks_)
300 s.append(
b.data(),
b.size());
305 return blocks_.size();
310 blocks_.insert(blocks_.end(),
311 std::make_move_iterator(
v.blocks_.begin()),
312 std::make_move_iterator(
v.blocks_.end()));
322 template<typename FileTypeTraits<filetype>::SyntaxType key,
typename...
T>
330 (
sizeof...(T) == fmt_nargs_valid.total_args),
331 "Types of all arguments and the number of arguments should match what the "
332 "formatting specifies.");
333 write_impl(fmt_nargs_valid.fmt, std::forward<T>(args)...);
339 void ensure_space(
size_t at_least)
341 if (blocks_.empty() || (blocks_.back().capacity() - blocks_.back().size() < at_least)) {
342 VectorChar &
b = blocks_.emplace_back(VectorChar());
343 b.reserve(
std::max(at_least, buffer_chunk_size));
347 template<
typename...
T>
void write_impl(
const char *fmt,
T &&...args)
350 fmt::memory_buffer buf;
351 fmt::format_to(fmt::appender(buf), fmt, std::forward<T>(args)...);
352 size_t len = buf.size();
354 VectorChar &bb = blocks_.back();
355 bb.insert(bb.end(), buf.begin(), buf.end());
#define BLI_STATIC_ASSERT(a, msg)
File and directory operations.
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr bool is_type_string_related
constexpr bool is_type_integral
constexpr bool is_type_float
constexpr FormattingSyntax syntax_elem_to_formatting(const eOBJSyntaxElement key)
@ vertex_uv_normal_indices
static const pxr::TfToken b("b", pxr::TfToken::Immortal)