X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=blobdiff_plain;f=cds%2Fdetails%2Fmarked_ptr.h;h=2a53c34cfec2ee153cef87659d730e0e7ca20d26;hp=62ea44e88d4277519cf281625e9aa8a34da9d6d4;hb=c73ad4707ac1d8ced279abd7eb7713f6300a676a;hpb=9e2654f9e05fa1ed4cbb78387363d735d385b74c diff --git a/cds/details/marked_ptr.h b/cds/details/marked_ptr.h index 62ea44e8..2a53c34c 100644 --- a/cds/details/marked_ptr.h +++ b/cds/details/marked_ptr.h @@ -1,4 +1,32 @@ -//$$CDS-header$$ +/* + This file is a part of libcds - Concurrent Data Structures library + + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 + + 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 @@ -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_MSVC14_1) + // 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 {