Fix clang-tidy and -Wnrvo findings in insert rollback helpers
Declare the rollback helpers non-movable, replace the nested conditional and C array in object_insert_rollback, silence the intentional copy in the allocator test, and avoid the missed NRVO in the test factory lambda. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N5NasAgbDGG28MqXjQvLqp Signed-off-by: Claude <noreply@anthropic.com>
This commit is contained in:
3 files changed
+40
-8
No files matched your search
@@ -4960,6 +4960,8 @@ public:
|
|||||||
: m_value(v), m_old_size(old_size) {}
|
: m_value(v), m_old_size(old_size) {}
|
||||||
array_append_rollback(const array_append_rollback&) = delete;
|
array_append_rollback(const array_append_rollback&) = delete;
|
||||||
array_append_rollback& operator=(const array_append_rollback&) = delete;
|
array_append_rollback& operator=(const array_append_rollback&) = delete;
|
||||||
|
array_append_rollback(array_append_rollback&&) = delete;
|
||||||
|
array_append_rollback& operator=(array_append_rollback&&) = delete;
|
||||||
|
|
||||||
void commit() noexcept
|
void commit() noexcept
|
||||||
{
|
{
|
||||||
@@ -5098,6 +5100,8 @@ public:
|
|||||||
explicit object_clear_on_failure(basic_json* v) noexcept : m_value(v) {}
|
explicit object_clear_on_failure(basic_json* v) noexcept : m_value(v) {}
|
||||||
object_clear_on_failure(const object_clear_on_failure&) = delete;
|
object_clear_on_failure(const object_clear_on_failure&) = delete;
|
||||||
object_clear_on_failure& operator=(const object_clear_on_failure&) = delete;
|
object_clear_on_failure& operator=(const object_clear_on_failure&) = delete;
|
||||||
|
object_clear_on_failure(object_clear_on_failure&&) = delete;
|
||||||
|
object_clear_on_failure& operator=(object_clear_on_failure&&) = delete;
|
||||||
|
|
||||||
void commit() noexcept
|
void commit() noexcept
|
||||||
{
|
{
|
||||||
@@ -5128,6 +5132,8 @@ public:
|
|||||||
object_insert_rollback(basic_json* v, SourceIterator first) : m_value(v), m_first(first) {}
|
object_insert_rollback(basic_json* v, SourceIterator first) : m_value(v), m_first(first) {}
|
||||||
object_insert_rollback(const object_insert_rollback&) = delete;
|
object_insert_rollback(const object_insert_rollback&) = delete;
|
||||||
object_insert_rollback& operator=(const object_insert_rollback&) = delete;
|
object_insert_rollback& operator=(const object_insert_rollback&) = delete;
|
||||||
|
object_insert_rollback(object_insert_rollback&&) = delete;
|
||||||
|
object_insert_rollback& operator=(object_insert_rollback&&) = delete;
|
||||||
|
|
||||||
/// call before each run of up to 64 members is inserted; may throw, which leaves the log complete
|
/// call before each run of up to 64 members is inserted; may throw, which leaves the log complete
|
||||||
void start_chunk()
|
void start_chunk()
|
||||||
@@ -5168,7 +5174,7 @@ public:
|
|||||||
for (std::size_t i = 0; i < m_count; ++i, ++it)
|
for (std::size_t i = 0; i < m_count; ++i, ++it)
|
||||||
{
|
{
|
||||||
const std::size_t chunk = i / 64;
|
const std::size_t chunk = i / 64;
|
||||||
const std::uint64_t word = chunk >= m_flushed ? m_word : (chunk < inline_words ? m_inline[chunk] : m_more[chunk - inline_words]);
|
const std::uint64_t word = logged_word(chunk);
|
||||||
if (((word >> (i % 64)) & 1U) != 0)
|
if (((word >> (i % 64)) & 1U) != 0)
|
||||||
{
|
{
|
||||||
object.erase(it->first);
|
object.erase(it->first);
|
||||||
@@ -5181,14 +5187,24 @@ public:
|
|||||||
private:
|
private:
|
||||||
static constexpr std::size_t inline_words = 4;
|
static constexpr std::size_t inline_words = 4;
|
||||||
|
|
||||||
|
/// the log word of a chunk: the one being filled, an inline one, or an overflow one
|
||||||
|
std::uint64_t logged_word(std::size_t chunk) const
|
||||||
|
{
|
||||||
|
if (chunk >= m_flushed)
|
||||||
|
{
|
||||||
|
return m_word;
|
||||||
|
}
|
||||||
|
return chunk < inline_words ? m_inline[chunk] : m_more[chunk - inline_words];
|
||||||
|
}
|
||||||
|
|
||||||
basic_json* m_value;
|
basic_json* m_value;
|
||||||
SourceIterator m_first;
|
SourceIterator m_first;
|
||||||
bool m_committed = false;
|
bool m_committed = false;
|
||||||
std::size_t m_count = 0;
|
std::size_t m_count = 0;
|
||||||
std::size_t m_flushed = 0;
|
std::size_t m_flushed = 0;
|
||||||
std::uint64_t m_word = 0;
|
std::uint64_t m_word = 0;
|
||||||
std::uint64_t m_inline[inline_words] {};
|
std::array<std::uint64_t, inline_words> m_inline {};
|
||||||
std::vector<std::uint64_t> m_more {};
|
std::vector<std::uint64_t> m_more;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
Generated
+19
-3
@@ -42752,6 +42752,8 @@ public:
|
|||||||
: m_value(v), m_old_size(old_size) {}
|
: m_value(v), m_old_size(old_size) {}
|
||||||
array_append_rollback(const array_append_rollback&) = delete;
|
array_append_rollback(const array_append_rollback&) = delete;
|
||||||
array_append_rollback& operator=(const array_append_rollback&) = delete;
|
array_append_rollback& operator=(const array_append_rollback&) = delete;
|
||||||
|
array_append_rollback(array_append_rollback&&) = delete;
|
||||||
|
array_append_rollback& operator=(array_append_rollback&&) = delete;
|
||||||
|
|
||||||
void commit() noexcept
|
void commit() noexcept
|
||||||
{
|
{
|
||||||
@@ -42890,6 +42892,8 @@ public:
|
|||||||
explicit object_clear_on_failure(basic_json* v) noexcept : m_value(v) {}
|
explicit object_clear_on_failure(basic_json* v) noexcept : m_value(v) {}
|
||||||
object_clear_on_failure(const object_clear_on_failure&) = delete;
|
object_clear_on_failure(const object_clear_on_failure&) = delete;
|
||||||
object_clear_on_failure& operator=(const object_clear_on_failure&) = delete;
|
object_clear_on_failure& operator=(const object_clear_on_failure&) = delete;
|
||||||
|
object_clear_on_failure(object_clear_on_failure&&) = delete;
|
||||||
|
object_clear_on_failure& operator=(object_clear_on_failure&&) = delete;
|
||||||
|
|
||||||
void commit() noexcept
|
void commit() noexcept
|
||||||
{
|
{
|
||||||
@@ -42920,6 +42924,8 @@ public:
|
|||||||
object_insert_rollback(basic_json* v, SourceIterator first) : m_value(v), m_first(first) {}
|
object_insert_rollback(basic_json* v, SourceIterator first) : m_value(v), m_first(first) {}
|
||||||
object_insert_rollback(const object_insert_rollback&) = delete;
|
object_insert_rollback(const object_insert_rollback&) = delete;
|
||||||
object_insert_rollback& operator=(const object_insert_rollback&) = delete;
|
object_insert_rollback& operator=(const object_insert_rollback&) = delete;
|
||||||
|
object_insert_rollback(object_insert_rollback&&) = delete;
|
||||||
|
object_insert_rollback& operator=(object_insert_rollback&&) = delete;
|
||||||
|
|
||||||
/// call before each run of up to 64 members is inserted; may throw, which leaves the log complete
|
/// call before each run of up to 64 members is inserted; may throw, which leaves the log complete
|
||||||
void start_chunk()
|
void start_chunk()
|
||||||
@@ -42960,7 +42966,7 @@ public:
|
|||||||
for (std::size_t i = 0; i < m_count; ++i, ++it)
|
for (std::size_t i = 0; i < m_count; ++i, ++it)
|
||||||
{
|
{
|
||||||
const std::size_t chunk = i / 64;
|
const std::size_t chunk = i / 64;
|
||||||
const std::uint64_t word = chunk >= m_flushed ? m_word : (chunk < inline_words ? m_inline[chunk] : m_more[chunk - inline_words]);
|
const std::uint64_t word = logged_word(chunk);
|
||||||
if (((word >> (i % 64)) & 1U) != 0)
|
if (((word >> (i % 64)) & 1U) != 0)
|
||||||
{
|
{
|
||||||
object.erase(it->first);
|
object.erase(it->first);
|
||||||
@@ -42973,14 +42979,24 @@ public:
|
|||||||
private:
|
private:
|
||||||
static constexpr std::size_t inline_words = 4;
|
static constexpr std::size_t inline_words = 4;
|
||||||
|
|
||||||
|
/// the log word of a chunk: the one being filled, an inline one, or an overflow one
|
||||||
|
std::uint64_t logged_word(std::size_t chunk) const
|
||||||
|
{
|
||||||
|
if (chunk >= m_flushed)
|
||||||
|
{
|
||||||
|
return m_word;
|
||||||
|
}
|
||||||
|
return chunk < inline_words ? m_inline[chunk] : m_more[chunk - inline_words];
|
||||||
|
}
|
||||||
|
|
||||||
basic_json* m_value;
|
basic_json* m_value;
|
||||||
SourceIterator m_first;
|
SourceIterator m_first;
|
||||||
bool m_committed = false;
|
bool m_committed = false;
|
||||||
std::size_t m_count = 0;
|
std::size_t m_count = 0;
|
||||||
std::size_t m_flushed = 0;
|
std::size_t m_flushed = 0;
|
||||||
std::uint64_t m_word = 0;
|
std::uint64_t m_word = 0;
|
||||||
std::uint64_t m_inline[inline_words] {};
|
std::array<std::uint64_t, inline_words> m_inline {};
|
||||||
std::vector<std::uint64_t> m_more {};
|
std::vector<std::uint64_t> m_more;
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -881,7 +881,7 @@ void check_strong_guarantee(const std::function<BasicJsonType()>& make,
|
|||||||
{
|
{
|
||||||
CHECK(j.dump() == before);
|
CHECK(j.dump() == before);
|
||||||
CHECK(children_name_their_parent(j));
|
CHECK(children_name_their_parent(j));
|
||||||
const BasicJsonType copy(j);
|
const BasicJsonType copy(j); // NOLINT(performance-unnecessary-copy-initialization): the copy is the point, it allocates
|
||||||
CHECK(copy.dump() == before);
|
CHECK(copy.dump() == before);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -917,7 +917,7 @@ void check_insert_strong_guarantee()
|
|||||||
j.push_back(std::string(64, 'd'));
|
j.push_back(std::string(64, 'd'));
|
||||||
j.erase(3);
|
j.erase(3);
|
||||||
}
|
}
|
||||||
return j;
|
return json_t(std::move(j));
|
||||||
};
|
};
|
||||||
|
|
||||||
for (const bool at_end :
|
for (const bool at_end :
|
||||||
|
|||||||
Reference in new issue
Block a user