@@ -247,6 +247,155 @@ namespace nfx::string
247247 return *this ;
248248 }
249249
250+ // ----------------------------------------------
251+ // Prepend operations
252+ // ----------------------------------------------
253+
254+ inline StringBuilder& StringBuilder::prepend ( const std::string& str )
255+ {
256+ prepend ( std::string_view{ str } );
257+ return *this ;
258+ }
259+
260+ inline StringBuilder& StringBuilder::prepend ( const char * str )
261+ {
262+ if ( str )
263+ {
264+ prepend ( std::string_view{ str, strlen ( str ) } );
265+ }
266+ return *this ;
267+ }
268+
269+ inline StringBuilder& StringBuilder::prepend ( char c )
270+ {
271+ if ( m_size + 1 > m_capacity ) [[unlikely]]
272+ {
273+ ensureCapacity ( m_size + 1 );
274+ }
275+
276+ char * buf = currentBuffer ();
277+
278+ // Shift existing content right by 1
279+ if ( m_size > 0 )
280+ {
281+ std::memmove ( buf + 1 , buf, m_size );
282+ }
283+
284+ buf[0 ] = c;
285+ ++m_size;
286+ return *this ;
287+ }
288+
289+ inline StringBuilder& StringBuilder::prepend ( std::int8_t value )
290+ {
291+ char buffer[INT8_MAX_DIGITS];
292+ auto [ptr, ec] = std::to_chars ( buffer, buffer + INT8_MAX_DIGITS, static_cast <int >( value ) );
293+ if ( ec == std::errc () ) [[likely]]
294+ {
295+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
296+ }
297+ return *this ;
298+ }
299+
300+ inline StringBuilder& StringBuilder::prepend ( std::uint8_t value )
301+ {
302+ char buffer[UINT8_MAX_DIGITS];
303+ auto [ptr, ec] = std::to_chars ( buffer, buffer + UINT8_MAX_DIGITS, static_cast <unsigned >( value ) );
304+ if ( ec == std::errc () ) [[likely]]
305+ {
306+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
307+ }
308+ return *this ;
309+ }
310+
311+ inline StringBuilder& StringBuilder::prepend ( std::int16_t value )
312+ {
313+ char buffer[INT16_MAX_DIGITS];
314+ auto [ptr, ec] = std::to_chars ( buffer, buffer + INT16_MAX_DIGITS, value );
315+ if ( ec == std::errc () ) [[likely]]
316+ {
317+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
318+ }
319+ return *this ;
320+ }
321+
322+ inline StringBuilder& StringBuilder::prepend ( std::uint16_t value )
323+ {
324+ char buffer[UINT16_MAX_DIGITS];
325+ auto [ptr, ec] = std::to_chars ( buffer, buffer + UINT16_MAX_DIGITS, value );
326+ if ( ec == std::errc () ) [[likely]]
327+ {
328+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
329+ }
330+ return *this ;
331+ }
332+
333+ inline StringBuilder& StringBuilder::prepend ( std::int32_t value )
334+ {
335+ char buffer[INT32_MAX_DIGITS];
336+ auto [ptr, ec] = std::to_chars ( buffer, buffer + INT32_MAX_DIGITS, value );
337+ if ( ec == std::errc () ) [[likely]]
338+ {
339+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
340+ }
341+ return *this ;
342+ }
343+
344+ inline StringBuilder& StringBuilder::prepend ( std::uint32_t value )
345+ {
346+ char buffer[UINT32_MAX_DIGITS];
347+ auto [ptr, ec] = std::to_chars ( buffer, buffer + UINT32_MAX_DIGITS, value );
348+ if ( ec == std::errc () ) [[likely]]
349+ {
350+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
351+ }
352+ return *this ;
353+ }
354+
355+ inline StringBuilder& StringBuilder::prepend ( std::int64_t value )
356+ {
357+ char buffer[INT64_MAX_DIGITS];
358+ auto [ptr, ec] = std::to_chars ( buffer, buffer + INT64_MAX_DIGITS, value );
359+ if ( ec == std::errc () ) [[likely]]
360+ {
361+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
362+ }
363+ return *this ;
364+ }
365+
366+ inline StringBuilder& StringBuilder::prepend ( std::uint64_t value )
367+ {
368+ char buffer[UINT64_MAX_DIGITS];
369+ auto [ptr, ec] = std::to_chars ( buffer, buffer + UINT64_MAX_DIGITS, value );
370+ if ( ec == std::errc () ) [[likely]]
371+ {
372+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
373+ }
374+ return *this ;
375+ }
376+
377+ inline StringBuilder& StringBuilder::prepend ( float value )
378+ {
379+ char buffer[FLOAT_MAX_CHARS];
380+ auto [ptr, ec] = std::to_chars ( buffer, buffer + FLOAT_MAX_CHARS, value );
381+ if ( ec == std::errc () ) [[likely]]
382+ {
383+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
384+ }
385+ return *this ;
386+ }
387+
388+ inline StringBuilder& StringBuilder::prepend ( double value )
389+ {
390+ char buffer[DOUBLE_MAX_CHARS];
391+ auto [ptr, ec] = std::to_chars ( buffer, buffer + DOUBLE_MAX_CHARS, value );
392+ if ( ec == std::errc () ) [[likely]]
393+ {
394+ return prepend ( std::string_view{ buffer, static_cast <size_t >( ptr - buffer ) } );
395+ }
396+ return *this ;
397+ }
398+
250399 // ----------------------------------------------
251400 // Batch operations
252401 // ----------------------------------------------
0 commit comments