mirror of
https://github.com/catchorg/Catch2.git
synced 2024-12-24 12:03:29 +01:00
73 lines
2.7 KiB
C
73 lines
2.7 KiB
C
|
/*
|
||
|
* Copyright 2016 Two Blue Cubes Ltd. All rights reserved.
|
||
|
*
|
||
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
*/
|
||
|
#ifndef CATCH_STRINGBUILDER_H_INCLUDED
|
||
|
#define CATCH_STRINGBUILDER_H_INCLUDED
|
||
|
|
||
|
#include "catch_stringref.h"
|
||
|
|
||
|
namespace Catch {
|
||
|
|
||
|
class String;
|
||
|
class StringData;
|
||
|
|
||
|
/// A mutable container for string data
|
||
|
/// Use to build up strings before transferring to an immutable String.
|
||
|
/// Construct the String using the rvalue reference constructor (which
|
||
|
/// will usually involve std::move-ing the StringBuilder). This will transfer
|
||
|
/// The underlying buffer without any extra allocations or ref counts.
|
||
|
class StringBuilder {
|
||
|
friend class String;
|
||
|
public:
|
||
|
using size_type = unsigned long;
|
||
|
|
||
|
StringBuilder();
|
||
|
StringBuilder( size_type initialCapacity );
|
||
|
StringBuilder( StringRef const& str, size_type initialCapacity );
|
||
|
StringBuilder( StringBuilder const& other, size_type initialCapacity );
|
||
|
StringBuilder( StringBuilder&& other ) noexcept;
|
||
|
StringBuilder( String&& other );
|
||
|
StringBuilder( String const& other );
|
||
|
~StringBuilder() noexcept;
|
||
|
|
||
|
void swap( StringBuilder& other ) noexcept;
|
||
|
|
||
|
auto size() const noexcept -> size_type;
|
||
|
auto capacity() const noexcept -> size_type;
|
||
|
|
||
|
/// Grows the buffer to exactly the capacity requested, or
|
||
|
/// does nothing if it is already at least as big
|
||
|
void reserve(size_type capacity);
|
||
|
|
||
|
/// Grows the buffer exponentially (from a baseline of 32 bytes)
|
||
|
/// until it is at least as large as the requested capacity -
|
||
|
/// or does nothing if already large enough
|
||
|
void reserveExponential(size_type capacity);
|
||
|
|
||
|
/// Writes the string at the current insertion point then moves
|
||
|
/// the insertion point forward by the string length.
|
||
|
/// If the buffer needs to grow to accomodate the string it does so
|
||
|
/// using the exponential strategy
|
||
|
void append( StringRef const& str );
|
||
|
|
||
|
friend auto operator << ( StringBuilder& sb, StringRef sr ) -> StringBuilder&;
|
||
|
friend auto operator << ( StringBuilder&& sb, StringRef sr ) -> StringBuilder&&;
|
||
|
|
||
|
/// Writes the contents of the string ref into the buffer at
|
||
|
/// the indexed location.
|
||
|
/// The bounds are not checked! Use append() to just add to the
|
||
|
/// end of the buffer, extending it if the capacity is not enough.
|
||
|
void writeTo( size_type index, StringRef const& str );
|
||
|
|
||
|
private:
|
||
|
size_type m_size = 0;
|
||
|
StringData* m_data;
|
||
|
};
|
||
|
|
||
|
} // namespace Catch
|
||
|
|
||
|
#endif // CATCH_STRINGBUILDER_H_INCLUDED
|