Skip to content

Commit

Permalink
requirements: use concepts to improve requirement validation
Browse files Browse the repository at this point in the history
  • Loading branch information
timblechmann committed May 3, 2024
1 parent 02883eb commit dc04d5c
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 6 deletions.
15 changes: 13 additions & 2 deletions include/boost/lockfree/lockfree_forward.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@

#ifndef BOOST_DOXYGEN_INVOKED

# include <cstddef> // size_t
# include <cstddef>
# include <type_traits>

# include <boost/config.hpp>

Expand All @@ -31,14 +32,24 @@ struct allocator;
// data structures

template < typename T, typename... Options >
# if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_copy_assignable_v< T >,
std::is_trivially_assignable_v< T&, T >,
std::is_trivially_destructible_v< T > )
# endif
class queue;

template < typename T, typename... Options >
# if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_copy_assignable_v< T > || std::is_move_assignable_v< T > )
# endif
class stack;

template < typename T, typename... Options >
# if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_default_constructible_v< T >, std::is_move_assignable_v< T > || std::is_copy_assignable_v< T > )
# endif
class spsc_queue;

}} // namespace boost::lockfree

#endif // BOOST_DOXYGEN_INVOKED
Expand Down
11 changes: 10 additions & 1 deletion include/boost/lockfree/queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ typedef parameter::parameters< boost::parameter::optional< tag::allocator >, boo
*
* */
template < typename T, typename... Options >
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_copy_assignable_v< T >,
std::is_trivially_assignable_v< T&, T >,
std::is_trivially_destructible_v< T > )
#endif
class queue
{
private:
Expand Down Expand Up @@ -167,7 +172,11 @@ class queue
*
* \pre Must specify a capacity<> argument
* */
queue( void ) :
queue( void )
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( has_capacity )
#endif
:
head_( tagged_node_handle( 0, 0 ) ),
tail_( tagged_node_handle( 0, 0 ) ),
pool( node_allocator(), capacity )
Expand Down
8 changes: 7 additions & 1 deletion include/boost/lockfree/spsc_queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -609,9 +609,12 @@ struct make_ringbuffer
*
* \b Requirements:
* - T must have a default constructor
* - T must be copyable
* - T must be copyable or movable
* */
template < typename T, typename... Options >
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_default_constructible_v< T >, std::is_move_assignable_v< T > || std::is_copy_assignable_v< T > )
#endif
class spsc_queue : public detail::make_ringbuffer< T, Options... >::ringbuffer_type
{
private:
Expand All @@ -637,6 +640,9 @@ class spsc_queue : public detail::make_ringbuffer< T, Options... >::ringbuffer_t
* \pre spsc_queue must be configured to be sized at compile-time
*/
spsc_queue( void )
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( !runtime_sized )
#endif
{
// Don't use BOOST_STATIC_ASSERT() here since it will be evaluated when compiling
// this function and this function may be compiled even when it isn't being used.
Expand Down
11 changes: 9 additions & 2 deletions include/boost/lockfree/stack.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,12 @@ typedef parameter::parameters< boost::parameter::optional< tag::allocator >, boo
* Specifies the allocator that is used for the internal freelist
*
* \b Requirements:
* - T must have a copy constructor
* - T must have a copy constructor or a move constructor
* */
template < typename T, typename... Options >
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( std::is_copy_assignable_v< T > || std::is_move_assignable_v< T > )
#endif
class stack
{
private:
Expand Down Expand Up @@ -132,7 +135,11 @@ class stack
*
* \pre Must specify a capacity<> argument
* */
explicit stack( void ) :
explicit stack( void )
#if !defined( BOOST_NO_CXX20_HDR_CONCEPTS )
requires( has_capacity )
#endif
:
pool( node_allocator(), capacity )
{
// Don't use BOOST_STATIC_ASSERT() here since it will be evaluated when compiling
Expand Down

0 comments on commit dc04d5c

Please sign in to comment.