etl::basic_string::copy is now const and does not affect the 'truncated' flag.

This commit is contained in:
John Wellbelove 2021-06-17 12:01:04 +01:00
parent 5bd7222e92
commit e44efd75a7
9 changed files with 590 additions and 34 deletions

View File

@ -1296,31 +1296,31 @@ namespace etl
//*********************************************************************
/// Copies a portion of a string.
///\param s Pointer to the string to copy.
///\param len The number of characters to copy.
///\param pos The position to start copying from.
///\param s Pointer to the string to copy.
///\param count The number of characters to copy.
///\param pos The position to start copying from.
//*********************************************************************
size_type copy(pointer s, size_type len, size_type pos = 0)
size_type copy(pointer dest, size_type count, size_type pos = 0) const
{
if ((pos + len > size()))
if (pos < size())
{
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
set_truncated(true);
if (count != npos)
{
count = etl::min(count, size() - pos);
}
else
{
count = size() - pos;
}
#if defined(ETL_STRING_TRUNCATION_IS_ERROR)
ETL_ALWAYS_ASSERT(ETL_ERROR(string_truncation));
#endif
#endif
etl::copy_n(p_buffer + pos, count, dest);
return count;
}
size_type endpos = etl::min(pos + len, size());
for (size_type i = pos; i < endpos; ++i)
else
{
*s++ = p_buffer[i];
return 0U;
}
return endpos - pos;
}
//*********************************************************************

View File

@ -3000,6 +3000,73 @@ namespace
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
Text text(initial_text.c_str());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_find_string)
{

View File

@ -3290,7 +3290,7 @@ namespace
TEST_FIXTURE(SetupFixture, test_copy)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
@ -3314,6 +3314,78 @@ namespace
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_find_string)
{

View File

@ -2995,8 +2995,75 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
Text text(initial_text.c_str());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}

View File

@ -3290,7 +3290,7 @@ namespace
TEST_FIXTURE(SetupFixture, test_copy)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
@ -3309,8 +3309,80 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}

View File

@ -2995,8 +2995,75 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
Text text(initial_text.c_str());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}

View File

@ -3290,7 +3290,7 @@ namespace
TEST_FIXTURE(SetupFixture, test_copy)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
@ -3309,8 +3309,80 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}

View File

@ -2995,8 +2995,75 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
Text text(initial_text.c_str());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
Text text(initial_text.c_str());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}

View File

@ -3290,7 +3290,7 @@ namespace
TEST_FIXTURE(SetupFixture, test_copy)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
@ -3309,8 +3309,80 @@ namespace
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_start_pos_too_large)
{
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
size_t length1 = text.copy(buffer1, 5, SIZE);
CHECK_EQUAL(0U, length1);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_equals_npos)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, Compare_Text::npos, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, Text::npos, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}
//*************************************************************************
TEST_FIXTURE(SetupFixture, test_copy_count_too_large)
{
Compare_Text compare_text(initial_text.c_str());
TextBuffer buffer;
Text text(initial_text.c_str(), buffer.data(), buffer.size());
value_t buffer1[SIZE];
value_t buffer2[SIZE];
size_t length1 = compare_text.copy(buffer1, SIZE, 2);
buffer1[length1] = STR('\0');
size_t length2 = text.copy(buffer2, SIZE, 2);
buffer2[length2] = STR('\0');
CHECK_EQUAL(length1, length2);
#if ETL_STRING_TRUNCATION_CHECKS_ENABLED
CHECK(!text.is_truncated());
#endif
bool is_equal = std::equal(buffer1,
buffer1 + length1,
buffer2);
CHECK(is_equal);
}