Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions doc/circular_buffer.qbk
Original file line number Diff line number Diff line change
Expand Up @@ -334,9 +334,9 @@ so for example: iterators `(begin() - 1)` and `(end() + 1)` are both invalid.
[h3 Debug Support]

In order to help a programmer to avoid and find common bugs,
the __cb contains a kind of debug support.
the __cb can be enabled to provide a kind of debug support.

The __cb maintains a list of valid iterators.
When the debugging functionality is enabled, the __cb maintains a list of valid iterators.
As soon as any element gets destroyed all iterators pointing to this element
are removed from this list and explicitly invalidated (an invalidation flag is set).
The debug support also consists of many assertions (`BOOST_ASSERT` macros)
Expand All @@ -349,9 +349,13 @@ Moreover, the uninitialized memory allocated by __cb is filled with the value `0
When debugging the code, this can help the programmer to recognize the initialized memory from the uninitialized.
For details refer the source code [@boost:boost/circular_buffer/debug.hpp circular_buffer/debug.hpp].

The debug support is enabled only in the debug mode (when the `NDEBUG` is not defined).
It can also be explicitly disabled (only for __cb)
by defining macro BOOST_CB_DISABLE_DEBUG.
[caution Since the debugging code makes __cb and its iterators more interconnected, thread safety guarantees of __cb
are different when debug support is enabled. In addition to the container itself, all iterators tracked by the container
(including any copies thereof) must be protected from concurrent access. In particular, this includes copying, destroying or
obtaining iterators from the container, even if for read-only access.]

The debug support is disabled by default. To enable it, one has to define `BOOST_CB_ENABLE_DEBUG` macro with the value of 1
while compiling the code using __cb.

[h3 Compatibility with Interprocess library]

Expand All @@ -360,7 +364,7 @@ The __cb is compatible with the [@boost:libs/interprocess/index.html Boost.Inte
library used for interprocess communication.
Considering that the circular_buffer's debug support relies on 'raw' pointers
(which is not permited by the Interprocess library)
the code has to compiled with `-DBOOST_CB_DISABLE_DEBUG` or `-DNDEBUG` (which disables the Debug Support).
the code has to compiled with debug support disabled (i.e. with `BOOST_CB_ENABLE_DEBUG` macro not defined or defined to 0).
Not doing that will cause the compilation to fail.

[endsect] [/section:implementation Implementation ]
Expand Down
2 changes: 0 additions & 2 deletions example/bounded_buffer_comparison.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#define BOOST_CB_DISABLE_DEBUG

#include <boost/circular_buffer.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
Expand Down
8 changes: 5 additions & 3 deletions example/circular_buffer_iter_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
// (See the accompanying file LICENSE_1_0.txt
// or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)

#undef BOOST_CB_ENABLE_DEBUG

//[circular_buffer_iter_example_1
/*`
*/

#define BOOST_CB_DISABLE_DEBUG // The Debug Support has to be disabled, otherwise the code produces a runtime error.
#define BOOST_CB_ENABLE_DEBUG 0 // The Debug Support has to be disabled, otherwise the code produces a runtime error.

#include <boost/circular_buffer.hpp>
#include <boost/assert.hpp>
Expand All @@ -34,5 +36,5 @@ int main(int /*argc*/, char* /*argv*/[])

return 0;
}
//] [/circular_buffer_iter_example_1]

//] [/circular_buffer_iter_example_1]
5 changes: 1 addition & 4 deletions include/boost/circular_buffer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,8 @@
#include <boost/static_assert.hpp>

// BOOST_CB_ENABLE_DEBUG: Debug support control.
#if defined(NDEBUG) || defined(BOOST_CB_DISABLE_DEBUG)
#if !defined(BOOST_CB_ENABLE_DEBUG)
#define BOOST_CB_ENABLE_DEBUG 0
#else
#define BOOST_CB_ENABLE_DEBUG 1
#endif

// BOOST_CB_ASSERT: Runtime assertion.
Expand Down Expand Up @@ -60,6 +58,5 @@
#undef BOOST_CB_ASSERT_TEMPLATED_ITERATOR_CONSTRUCTORS
#undef BOOST_CB_IS_CONVERTIBLE
#undef BOOST_CB_ASSERT
#undef BOOST_CB_ENABLE_DEBUG

#endif // #if !defined(BOOST_CIRCULAR_BUFFER_HPP)
13 changes: 7 additions & 6 deletions include/boost/circular_buffer/base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <boost/type_traits/is_nothrow_move_assignable.hpp>
#include <boost/type_traits/is_copy_constructible.hpp>
#include <boost/type_traits/conditional.hpp>
#include <boost/move/adl_move_swap.hpp>
#include <boost/move/move.hpp>
#include <boost/utility/addressof.hpp>
#include <algorithm>
Expand Down Expand Up @@ -1399,11 +1400,11 @@ class circular_buffer
*/
void swap(circular_buffer<T, Alloc>& cb) BOOST_NOEXCEPT {
swap_allocator(cb, is_stateless<allocator_type>());
std::swap(m_buff, cb.m_buff);
std::swap(m_end, cb.m_end);
std::swap(m_first, cb.m_first);
std::swap(m_last, cb.m_last);
std::swap(m_size, cb.m_size);
adl_move_swap(m_buff, cb.m_buff);
adl_move_swap(m_end, cb.m_end);
adl_move_swap(m_first, cb.m_first);
adl_move_swap(m_last, cb.m_last);
adl_move_swap(m_size, cb.m_size);
#if BOOST_CB_ENABLE_DEBUG
invalidate_all_iterators();
cb.invalidate_all_iterators();
Expand Down Expand Up @@ -2627,7 +2628,7 @@ class circular_buffer

//! Specialized method for swapping the allocator.
void swap_allocator(circular_buffer<T, Alloc>& cb, const false_type&) {
std::swap(m_alloc, cb.m_alloc);
adl_move_swap(m_alloc, cb.m_alloc);
}

//! Specialized assign method.
Expand Down
5 changes: 2 additions & 3 deletions include/boost/circular_buffer/details.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#pragma once
#endif

#include <boost/iterator.hpp>
#include <boost/throw_exception.hpp>
#include <boost/container/allocator_traits.hpp>
#include <boost/move/move.hpp>
Expand Down Expand Up @@ -196,7 +195,7 @@ class capacity_control {
*/
template <class Buff, class Traits>
struct iterator :
public boost::iterator<
public std::iterator<
std::random_access_iterator_tag,
typename Traits::value_type,
typename Traits::difference_type,
Expand All @@ -209,7 +208,7 @@ struct iterator :
// Helper types

//! Base iterator.
typedef boost::iterator<
typedef std::iterator<
std::random_access_iterator_tag,
typename Traits::value_type,
typename Traits::difference_type,
Expand Down
2 changes: 1 addition & 1 deletion include/boost/circular_buffer/space_optimized.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ public:<br>
\par Iterator Invalidation
Invalidates all iterators of both <code>circular_buffer_space_optimized</code> containers. (On the other
hand the iterators still point to the same elements but within another container. If you want to rely on
this feature you have to turn the __debug_support off by defining macro BOOST_CB_DISABLE_DEBUG,
this feature you have to turn the __debug_support off,
otherwise an assertion will report an error if such invalidated iterator is used.)
\par Complexity
Constant (in the size of the <code>circular_buffer_space_optimized</code>).
Expand Down
12 changes: 7 additions & 5 deletions test/Jamfile.v2
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
# accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)

# Added warning supression Paul A. Bristow 25 Nov 2008
# Added warning suppression Paul A. Bristow 25 Nov 2008

# Bring in rules for testing.
import testing ;
Expand All @@ -22,9 +22,11 @@ project
;

test-suite "circular_buffer"
: [ run base_test.cpp : <threading>single : ]
[ run space_optimized_test.cpp : <threading>single : ]
[ run soft_iterator_invalidation.cpp : <threading>single : ]
[ run constant_erase_test.cpp : <threading>single : ]
: [ run base_test.cpp : : : <threading>single : ]
[ run space_optimized_test.cpp : : : <threading>single : ]
[ run base_test.cpp : : : <threading>single <define>"BOOST_CB_ENABLE_DEBUG=1" : base_test_dbg ]
[ run space_optimized_test.cpp : : : <threading>single <define>"BOOST_CB_ENABLE_DEBUG=1" : space_optimized_test_dbg ]
[ run soft_iterator_invalidation.cpp : : : <threading>single : ]
[ run constant_erase_test.cpp : : : <threading>single : ]
[ compile bounded_buffer_comparison.cpp : <threading>multi : ]
;
4 changes: 2 additions & 2 deletions test/base_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void iterator_comparison_test() {

void iterator_invalidation_test() {

#if !defined(NDEBUG) && !defined(BOOST_CB_DISABLE_DEBUG)
#if BOOST_CB_ENABLE_DEBUG

circular_buffer<MyInteger>::iterator it1;
circular_buffer<MyInteger>::const_iterator it2;
Expand Down Expand Up @@ -563,7 +563,7 @@ void iterator_invalidation_test() {
BOOST_CHECK(it3.is_valid(&cb16));
BOOST_CHECK(!it4.is_valid(&cb16));

#endif // #if !defined(NDEBUG) && !defined(BOOST_CB_DISABLE_DEBUG)
#endif // #if BOOST_CB_ENABLE_DEBUG
}

// basic exception safety test (it is useful to use any memory-leak detection tool)
Expand Down
2 changes: 0 additions & 2 deletions test/bounded_buffer_comparison.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#define BOOST_CB_DISABLE_DEBUG

#include <boost/circular_buffer.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>
Expand Down
2 changes: 0 additions & 2 deletions test/constant_erase_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#define BOOST_CB_DISABLE_DEBUG

#include "test.hpp"

int MyInteger::ms_exception_trigger = 0;
Expand Down
2 changes: 0 additions & 2 deletions test/soft_iterator_invalidation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#define BOOST_CB_DISABLE_DEBUG

#include "test.hpp"

// test of the example (introduced in the documentation)
Expand Down
4 changes: 2 additions & 2 deletions test/space_optimized_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ void shrink_to_fit_test() {

void iterator_invalidation_test() {

#if !defined(NDEBUG) && !defined(BOOST_CB_DISABLE_DEBUG)
#if BOOST_CB_ENABLE_DEBUG

cb_space_optimized cb1(10, 1);
cb1.push_back(2);
Expand Down Expand Up @@ -177,7 +177,7 @@ void iterator_invalidation_test() {
BOOST_CHECK(!it2.is_valid(&cb1));
BOOST_CHECK(!it3.is_valid(&cb1));

#endif // #if !defined(NDEBUG) && !defined(BOOST_CB_DISABLE_DEBUG)
#endif // #if BOOST_CB_ENABLE_DEBUG
}

// test main
Expand Down