================ @@ -58,23 +59,156 @@ namespace __format { /// This helper is used together with the @ref back_insert_iterator to offer /// type-erasure for the formatting functions. This reduces the number to /// template instantiations. +/// +/// The design of the class is being changed to improve performance and do some +/// code cleanups. +/// The original design (as shipped up to LLVM-19) uses the following design: +/// - There is an external object that connects the buffer to the output. +/// - The class constructor stores a function pointer to a grow function and a +/// type-erased pointer to the object that does the grow. +/// - When writing data to the buffer would exceed the external buffer's +/// capacity it requests the external buffer to flush its contents. +/// +/// The new design tries to solve some issues with the current design: +/// - The buffer used is a fixed-size buffer, benchmarking shows that using a +/// dynamic allocated buffer has performance benefits. +/// - Implementing P3107R5 "Permit an efficient implementation of std::print" +/// is not trivial with the current buffers. Using the code from this series +/// makes it trivial. +/// +/// This class is ABI-tagged, still the new design does not change the size of +/// objects of this class. +/// +/// The new design contains information regarding format_to_n changes, these +/// will be implemented in follow-up patch. +/// +/// The new design is the following. +/// - There is an external object that connects the buffer to the output. +/// - This buffer object: +/// - inherits publicly from this class. +/// - has a static or dynamic buffer. +/// - has a static member function to make space in its buffer write +/// operations. This can be done by increasing the size of the internal +/// buffer or by writing the contents of the buffer to the output iterator. +/// +/// This member function is a constructor argument, so its name is not +/// fixed. The code uses the name __prepare_write. +/// - The number of output code units can be limited by a __max_output_size +/// object. This is used in format_to_n This object: +/// - Contains the maximum number of code units to be written. +/// - Contains the number of code units that are requested to be written. +/// This number is returned to the user of format_to_n. +/// - The write functions call objects __request_write member function. +/// This function: ---------------- ldionne wrote:
```suggestion /// - The write functions call the object's __request_write member function. /// This function: ``` https://github.com/llvm/llvm-project/pull/101817 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits