1 ///////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Ion Gaztanaga 2014-2014 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // See http://www.boost.org/libs/intrusive for documentation. 10 // 11 ///////////////////////////////////////////////////////////////////////////// 12 13 #ifndef BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP 14 #define BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP 15 16 #ifndef BOOST_CONFIG_HPP 17 # include <boost/config.hpp> 18 #endif 19 20 #if defined(BOOST_HAS_PRAGMA_ONCE) 21 # pragma once 22 #endif 23 24 #include <boost/intrusive/detail/workaround.hpp> 25 26 namespace boost { 27 namespace intrusive { 28 namespace detail { 29 30 template<bool ConstantSize, class SizeType, class Tag = void> 31 struct size_holder 32 { 33 static const bool constant_time_size = ConstantSize; 34 typedef SizeType size_type; 35 get_sizeboost::intrusive::detail::size_holder36 BOOST_INTRUSIVE_FORCEINLINE SizeType get_size() const 37 { return size_; } 38 set_sizeboost::intrusive::detail::size_holder39 BOOST_INTRUSIVE_FORCEINLINE void set_size(SizeType size) 40 { size_ = size; } 41 decrementboost::intrusive::detail::size_holder42 BOOST_INTRUSIVE_FORCEINLINE void decrement() 43 { --size_; } 44 incrementboost::intrusive::detail::size_holder45 BOOST_INTRUSIVE_FORCEINLINE void increment() 46 { ++size_; } 47 increaseboost::intrusive::detail::size_holder48 BOOST_INTRUSIVE_FORCEINLINE void increase(SizeType n) 49 { size_ += n; } 50 decreaseboost::intrusive::detail::size_holder51 BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType n) 52 { size_ -= n; } 53 swapboost::intrusive::detail::size_holder54 BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder &other) 55 { SizeType tmp(size_); size_ = other.size_; other.size_ = tmp; } 56 57 SizeType size_; 58 }; 59 60 template<class SizeType, class Tag> 61 struct size_holder<false, SizeType, Tag> 62 { 63 static const bool constant_time_size = false; 64 typedef SizeType size_type; 65 get_sizeboost::intrusive::detail::size_holder66 BOOST_INTRUSIVE_FORCEINLINE size_type get_size() const 67 { return 0; } 68 set_sizeboost::intrusive::detail::size_holder69 BOOST_INTRUSIVE_FORCEINLINE void set_size(size_type) 70 {} 71 decrementboost::intrusive::detail::size_holder72 BOOST_INTRUSIVE_FORCEINLINE void decrement() 73 {} 74 incrementboost::intrusive::detail::size_holder75 BOOST_INTRUSIVE_FORCEINLINE void increment() 76 {} 77 increaseboost::intrusive::detail::size_holder78 BOOST_INTRUSIVE_FORCEINLINE void increase(SizeType) 79 {} 80 decreaseboost::intrusive::detail::size_holder81 BOOST_INTRUSIVE_FORCEINLINE void decrease(SizeType) 82 {} 83 swapboost::intrusive::detail::size_holder84 BOOST_INTRUSIVE_FORCEINLINE void swap(size_holder){} 85 }; 86 87 } //namespace detail{ 88 } //namespace intrusive{ 89 } //namespace boost{ 90 91 #endif //BOOST_INTRUSIVE_DETAIL_SIZE_HOLDER_HPP 92