diff options
Diffstat (limited to 'extern/quadriflow/3rd/pss/pss/pss_common.h')
-rw-r--r-- | extern/quadriflow/3rd/pss/pss/pss_common.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/extern/quadriflow/3rd/pss/pss/pss_common.h b/extern/quadriflow/3rd/pss/pss/pss_common.h new file mode 100644 index 00000000000..628c0f9830a --- /dev/null +++ b/extern/quadriflow/3rd/pss/pss/pss_common.h @@ -0,0 +1,106 @@ +/* + Copyright (C) 2014 Intel Corporation + All rights reserved. + + 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. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + 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. +*/ +#include <utility> +#include <iterator> + +namespace pss { + +namespace internal { + +//! Destroy sequence [xs,xe) +template<class RandomAccessIterator> +void serial_destroy( RandomAccessIterator zs, RandomAccessIterator ze ) { + typedef typename std::iterator_traits<RandomAccessIterator>::value_type T; + while( zs!=ze ) { + --ze; + (*ze).~T(); + } +} + +//! Merge sequences [xs,xe) and [ys,ye) to output sequence [zs,(xe-xs)+(ye-ys)), using std::move +template<class RandomAccessIterator1, class RandomAccessIterator2, class RandomAccessIterator3, class Compare> +void serial_move_merge( RandomAccessIterator1 xs, RandomAccessIterator1 xe, RandomAccessIterator2 ys, RandomAccessIterator2 ye, RandomAccessIterator3 zs, Compare comp ) { + if( xs!=xe ) { + if( ys!=ye ) { + for(;;) { + if( comp(*ys,*xs) ) { + *zs = std::move(*ys); + ++zs; + if( ++ys==ye ) { break; } + } else { + *zs = std::move(*xs); + ++zs; + if( ++xs==xe ) { goto movey; } + } + } + } + ys = xs; + ye = xe; + } +movey: + std::move( ys, ye, zs ); +} + +template<typename RandomAccessIterator1, typename RandomAccessIterator2, typename Compare> +void stable_sort_base_case( RandomAccessIterator1 xs, RandomAccessIterator1 xe, RandomAccessIterator2 zs, int inplace, Compare comp) { + std::stable_sort( xs, xe, comp ); + if( inplace!=2 ) { + RandomAccessIterator2 ze = zs + (xe-xs); + typedef typename std::iterator_traits<RandomAccessIterator2>::value_type T; + if( inplace ) + // Initialize the temporary buffer + for( ; zs<ze; ++zs ) + new(&*zs) T; + else + // Initialize the temporary buffer and move keys to it. + for( ; zs<ze; ++xs, ++zs ) + new(&*zs) T(std::move(*xs)); + } +} + +//! Raw memory buffer with automatic cleanup. +class raw_buffer { + void* ptr; +public: + //! Try to obtain buffer of given size. + raw_buffer( size_t bytes ) : ptr( operator new(bytes,std::nothrow) ) {} + //! True if buffer was successfully obtained, zero otherwise. + operator bool() const {return ptr;} + //! Return pointer to buffer, or NULL if buffer could not be obtained. + void* get() const {return ptr;} + //! Destroy buffer + ~raw_buffer() {operator delete(ptr);} +}; + +} // namespace internal + +} // namespace pss |