X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=cds%2Fdetails%2Fmarked_ptr.h;h=ba0bf3708512b69197c23a1ba9cb251c8b3e58f8;hb=838bdc34e1054b70c0cb23b5298b765785f1121b;hp=9471d67a7df0999237e896a1db0b9beec5519059;hpb=3d027d83c1f8667ce35681b113ef999f3ea10540;p=libcds.git diff --git a/cds/details/marked_ptr.h b/cds/details/marked_ptr.h index 9471d67a..ba0bf370 100644 --- a/cds/details/marked_ptr.h +++ b/cds/details/marked_ptr.h @@ -1,9 +1,37 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library -#ifndef __CDS_DETAILS_MARKED_PTR_H -#define __CDS_DETAILS_MARKED_PTR_H + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 -#include + Source code repo: http://github.com/khizmax/libcds/ + Download: http://sourceforge.net/projects/libcds/files/ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef CDSLIB_DETAILS_MARKED_PTR_H +#define CDSLIB_DETAILS_MARKED_PTR_H + +#include namespace cds { namespace details { @@ -22,7 +50,7 @@ namespace cds { template class marked_ptr { - T * m_ptr ; ///< pointer and its mark bits + T * m_ptr ; ///< pointer and its mark bits public: typedef T value_type ; ///< type of value the class points to @@ -67,14 +95,21 @@ namespace cds { private: //@cond + union pointer_cast { + T * ptr; + uintptr_t n; + + pointer_cast(T * p) : ptr(p) {} + pointer_cast(uintptr_t i) : n(i) {} + }; static uintptr_t to_int( value_type * p ) CDS_NOEXCEPT { - return reinterpret_cast( p ); + return pointer_cast(p).n; } static value_type * to_ptr( uintptr_t n ) CDS_NOEXCEPT { - return reinterpret_cast< value_type *>( n ); + return pointer_cast(n).ptr; } uintptr_t to_int() const CDS_NOEXCEPT @@ -127,7 +162,7 @@ namespace cds { marked_ptr& operator &=( int nBits ) CDS_NOEXCEPT { assert( (nBits & pointer_bitmask) == 0 ); - m_ptr = to_ptr( to_int() & (pointer_bitmask | nBits) ); + m_ptr = to_ptr( to_int() & (pointer_bitmask | nBits)); return *this; } @@ -330,7 +365,7 @@ CDS_CXX11_ATOMIC_BEGIN_NAMESPACE {} CDS_CONSTEXPR explicit atomic(marked_ptr val) CDS_NOEXCEPT - : m_atomic( val.all() ) + : m_atomic( val.all()) {} CDS_CONSTEXPR explicit atomic(T * p) CDS_NOEXCEPT : m_atomic( p ) @@ -339,8 +374,8 @@ CDS_CXX11_ATOMIC_BEGIN_NAMESPACE atomic(const atomic&) = delete; atomic& operator=(const atomic&) = delete; -#if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION <= CDS_COMPILER_MSVC12) - // MSVC12: warning C4522: multiple assignment operators specified +#if !(CDS_COMPILER == CDS_COMPILER_MSVC && CDS_COMPILER_VERSION < CDS_COMPILER_MSVC15) + // MSVC12, MSVC14, MSVC14.1: warning C4522: multiple assignment operators specified atomic& operator=(const atomic&) volatile = delete; marked_ptr operator=(marked_ptr val) volatile CDS_NOEXCEPT { @@ -358,4 +393,4 @@ CDS_CXX11_ATOMIC_BEGIN_NAMESPACE CDS_CXX11_ATOMIC_END_NAMESPACE //@endcond -#endif // #ifndef __CDS_DETAILS_MARKED_PTR_H +#endif // #ifndef CDSLIB_DETAILS_MARKED_PTR_H