@ -19,10 +19,12 @@
namespace {
int resize_call_count = 0 ;
int append_call_count = 0 ;
// A mock string class whose only purpose is to track how many times its
// resize() method has been called.
// resize()/append() methods have been called.
struct resizable_string {
using value_type = char ;
size_t size ( ) const { return 0 ; }
size_t capacity ( ) const { return 0 ; }
char & operator [ ] ( size_t ) {
@ -30,14 +32,18 @@ struct resizable_string {
return c ;
}
void resize ( size_t ) { resize_call_count + = 1 ; }
void append ( size_t , value_type ) { append_call_count + = 1 ; }
void reserve ( size_t ) { }
resizable_string & erase ( size_t = 0 , size_t = 0 ) { return * this ; }
} ;
int resize_default_init_call_count = 0 ;
int append_default_init_call_count = 0 ;
// A mock string class whose only purpose is to track how many times its
// resize() and __resize_default_init() methods have been called.
struct resize_default_init_string {
// resize()/__resize_default_init()/append()/__append_default_init() methods
// have been called.
struct default_init_string {
size_t size ( ) const { return 0 ; }
size_t capacity ( ) const { return 0 ; }
char & operator [ ] ( size_t ) {
@ -46,46 +52,68 @@ struct resize_default_init_string {
}
void resize ( size_t ) { resize_call_count + = 1 ; }
void __resize_default_init ( size_t ) { resize_default_init_call_count + = 1 ; }
void __append_default_init ( size_t ) { append_default_init_call_count + = 1 ; }
void reserve ( size_t ) { }
default_init_string & erase ( size_t = 0 , size_t = 0 ) { return * this ; }
} ;
TEST ( ResizeUninit , WithAndWithout ) {
resize_call_count = 0 ;
append_call_count = 0 ;
resize_default_init_call_count = 0 ;
append_default_init_call_count = 0 ;
{
resizable_string rs ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
EXPECT_FALSE (
absl : : strings_internal : : STLStringSupportsNontrashingResize ( & rs ) ) ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
absl : : strings_internal : : STLStringResizeUninitialized ( & rs , 237 ) ;
EXPECT_EQ ( resize_call_count , 1 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
absl : : strings_internal : : STLStringResizeUninitializedAmortized ( & rs , 1000 ) ;
EXPECT_EQ ( resize_call_count , 2 ) ;
EXPECT_EQ ( resize_call_count , 1 ) ;
EXPECT_EQ ( append_call_count , 1 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
}
resize_call_count = 0 ;
append_call_count = 0 ;
resize_default_init_call_count = 0 ;
append_default_init_call_count = 0 ;
{
resize_ default_init_string rus ;
default_init_string rus ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
EXPECT_TRUE (
absl : : strings_internal : : STLStringSupportsNontrashingResize ( & rus ) ) ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 0 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
absl : : strings_internal : : STLStringResizeUninitialized ( & rus , 237 ) ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 1 ) ;
EXPECT_EQ ( append_default_init_call_count , 0 ) ;
absl : : strings_internal : : STLStringResizeUninitializedAmortized ( & rus , 1000 ) ;
EXPECT_EQ ( resize_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 2 ) ;
EXPECT_EQ ( append_call_count , 0 ) ;
EXPECT_EQ ( resize_default_init_call_count , 1 ) ;
EXPECT_EQ ( append_default_init_call_count , 1 ) ;
}
}