Changeset 388 for trunk


Ignore:
Timestamp:
06/06/15 16:16:30 (10 years ago)
Author:
epyon
Message:
  • stl/algorithm split up
Location:
trunk/nv/stl
Files:
5 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/stl/algorithm.hh

    r383 r388  
    1010* @brief STL algorithm library
    1111*/
    12 // TODO: implement fill_default!
    1312
    1413#ifndef NV_STL_ALGORITHM_HH
    1514#define NV_STL_ALGORITHM_HH
    1615
    17 #include <nv/core/common.hh>
     16#include <nv/stl/algorithm/common.hh>
     17#include <nv/stl/algorithm/raw.hh>
     18#include <nv/stl/algorithm/copy.hh>
     19#include <nv/stl/algorithm/fill.hh>
    1820#include <nv/stl/utility.hh>
    1921#include <nv/stl/iterator.hh>
    20 #include <nv/stl/capi.hh>
    2122
    2223namespace nv
     
    186187        }
    187188
    188         template< typename T >
    189         T* raw_copy( const T* first, const T* last, T* out )
    190         {
    191                 return (T*)nvmemcpy( out, first, (size_t)( (uintptr_t)last - (uintptr_t)first ) ) + ( last - first );
    192         }
    193 
    194         template< typename T >
    195         T* raw_copy_n( const T* ptr, size_t n, T* out )
    196         {
    197                 return (T*)nvmemcpy( out, ptr, n * sizeof(T) ) + n;
    198         }
    199 
    200         template< typename T >
    201         T* raw_alias_copy( const T* first, const T* last, T* out )
    202         {
    203                 return (T*)nvmemmove( out, first, (size_t)( (uintptr_t)last - (uintptr_t)first ) ) + ( last - first );
    204         }
    205 
    206         template< typename T >
    207         T* raw_alias_copy_n( const T* ptr, size_t n, T* out )
    208         {
    209                 return (T*)nvmemmove( out, ptr, n * sizeof( T ) ) + n;
    210         }
    211 
    212         template< typename T >
    213         T* raw_zero( T* first, T* last )
    214         {
    215                 return (T*)nvmemset( first, 0, (size_t)( (uintptr_t)last - (uintptr_t)first ) ) + ( last - first );
    216         }
    217 
    218         template< typename T >
    219         T* raw_zero_n( T* ptr, size_t n )
    220         {
    221                 return (T*)nvmemset( ptr, 0, n * sizeof( T ) ) + n;
    222         }
    223 
    224         template< typename T >
    225         T* raw_fill( T* first, T* last, unsigned char value )
    226         {
    227                 return (T*)nvmemset( first, value, (size_t)( (uintptr_t)last - (uintptr_t)first ) ) + ( last - first );
    228         }
    229 
    230         template< typename T >
    231         T* raw_fill_n( T* ptr, size_t n, unsigned char value )
    232         {
    233                 return (T*)nvmemset( ptr, value, n * sizeof( T ) ) + n;
    234         }
    235 
    236         namespace detail
    237         {
    238                 template < typename ForwardIterator, typename T, typename AnyType >
    239                 void fill_impl( ForwardIterator first, ForwardIterator last, const T& value, AnyType, forward_iterator_tag )
    240                 {
    241                         // TODO: version with T temp = value for scalars
    242                         for (; first != last; ++first )
    243                                 *first = value;
    244                 }
    245 
    246                 template < typename BlockAccessIterator, typename T >
    247                 void fill_impl( BlockAccessIterator first, BlockAccessIterator last, T value, true_type, block_access_iterator_tag )
    248                 {
    249                         raw_fill( first, last, (unsigned char)value ); 
    250                 }
    251 
    252                 template < typename ForwardIterator, typename T, typename AnyType >
    253                 ForwardIterator fill_n_impl( ForwardIterator first, size_t count, const T& value, AnyType, forward_iterator_tag )
    254                 {
    255                         // TODO: version with T temp = T() for scalars
    256                         for ( ; count-- > 0; ++first ) *first = value;
    257                         return first;
    258                 }
    259 
    260                 template < typename BlockAccessIterator, typename T >
    261                 BlockAccessIterator fill_n_impl( BlockAccessIterator first, size_t count, T value, true_type, block_access_iterator_tag )
    262                 {
    263                         return BlockAccessIterator( raw_fill_n( first, count, (unsigned char)value ) );
    264                 }
    265 
    266                 template < typename ForwardIterator, typename T, typename AnyType >
    267                 void fill_default_impl( ForwardIterator first, ForwardIterator last, AnyType, forward_iterator_tag )
    268                 {
    269                         // TODO: version with T temp = T() for scalars
    270                         for ( ; first != last; ++first )
    271                                 *first = T();
    272                 }
    273 
    274                 template < typename BlockAccessIterator, typename T >
    275                 void fill_default_impl( BlockAccessIterator first, BlockAccessIterator last, true_type, block_access_iterator_tag )
    276                 {
    277                         raw_zero( first, last );
    278                 }
    279 
    280                 template < typename ForwardIterator, typename T, typename AnyType >
    281                 ForwardIterator fill_default_n_impl( ForwardIterator first, size_t n, AnyType, forward_iterator_tag )
    282                 {
    283                         // TODO: version with T temp = T() for scalars
    284                         for ( ; n-- > 0; ++first ) *first = value;
    285                         return first;
    286                 }
    287 
    288                 template < typename BlockAccessIterator, typename T >
    289                 BlockAccessIterator fill_default_n_impl( BlockAccessIterator first, size_t count, true_type, block_access_iterator_tag )
    290                 {
    291                         return BlockAccessIterator( raw_zero_n( first, count, (unsigned char)value ) );
    292                 }
    293         }
    294 
    295         // TODO: fill_default special case!
    296         template < typename ForwardIterator, typename T >
    297         inline void fill( ForwardIterator first, ForwardIterator last, const T& value )
    298         {
    299                 typedef typename iterator_traits< ForwardIterator >::value_type        value_type;
    300                 typedef typename iterator_traits< ForwardIterator >::iterator_category iterator_category;
    301                 detail::fill_impl( first, last, static_cast<value_type>( value ),
    302                         bool_constant< sizeof( value_type ) == 1 &&
    303                         has_trivial_assign<value_type>::value >(), iterator_category() );
    304         }
    305 
    306         template < typename ForwardIterator, typename T >
    307         inline ForwardIterator fill_n( ForwardIterator first, size_t count, const T& value )
    308         {
    309                 typedef typename iterator_traits< ForwardIterator >::value_type value_type;
    310                 typedef typename iterator_traits< ForwardIterator >::iterator_category iterator_category;
    311                 return detail::fill_n_impl( first, count, static_cast<value_type>( value ),
    312                         bool_constant< sizeof( value_type ) == 1 && has_trivial_assign<value_type>::value >(), iterator_category() );
    313         }
    314 
    315         template < typename ForwardIterator >
    316         inline void fill_default( ForwardIterator first, ForwardIterator last )
    317         {
    318                 typedef typename iterator_traits< ForwardIterator >::value_type value_type;
    319                 typedef typename iterator_traits< ForwardIterator >::iterator_category iterator_category;
    320                 detail::fill_default_impl( first, last,
    321                         bool_constant< sizeof( value_type ) == 1 && has_trivial_assign<value_type>::value >(), iterator_category() );
    322         }
    323 
    324         template < typename ForwardIterator >
    325         inline ForwardIterator fill_default_n( ForwardIterator first, size_t count )
    326         {
    327                 typedef typename iterator_traits< ForwardIterator >::value_type value_type;
    328                 typedef typename iterator_traits< ForwardIterator >::iterator_category iterator_category;
    329                 return detail::fill_default_n_impl( first, count,
    330                         bool_constant< sizeof( value_type ) == 1 && has_trivial_assign<value_type>::value >(), iterator_category() );
    331         }
    332 
    333         namespace detail
    334         {
    335                 template< typename InputIterator, typename OutputIterator, typename AnyType >
    336                 inline OutputIterator copy_impl( InputIterator first, InputIterator last, OutputIterator out, AnyType, input_iterator_tag, forward_iterator_tag )
    337                 {
    338                         for ( ; first != last; ++first, ++out )
    339                                 *first = *out;
    340                         return out;
    341                 }
    342 
    343                 template< typename BlockAccessIterator, typename OutputIterator >
    344                 inline BlockAccessIterator copy_impl( BlockAccessIterator first, BlockAccessIterator last, OutputIterator out, true_type, block_access_iterator_tag, block_access_iterator_tag )
    345                 {
    346                         return raw_alias_copy( first, last, out )
    347                 }
    348 
    349                 template< typename InputIterator, typename OutputIterator, typename AnyType >
    350                 inline OutputIterator copy_n_impl( InputIterator first, size_t n, OutputIterator out, AnyType, input_iterator_tag, forward_iterator_tag )
    351                 {
    352                         for ( ; n-- > 0; ++first, ++out ) *first = *out;
    353                         return out;
    354                 }
    355 
    356                 template< typename BlockAccessIterator, typename OutputIterator >
    357                 inline BlockAccessIterator copy_n_impl( BlockAccessIterator first, BlockAccessIterator n, OutputIterator out, true_type, block_access_iterator_tag, block_access_iterator_tag )
    358                 {
    359                         return raw_alias_copy_n( first, n, out )
    360                 }
    361         }
    362 
    363         template< class InputIterator, class OutputIterator >
    364         inline OutputIterator copy( InputIterator first, InputIterator last, OutputIterator out )
    365         {
    366                 typedef typename iterator_traits< InputIterator >::value_type value_type;
    367                 typedef typename iterator_traits< InputIterator >::iterator_category input_iterator_category;
    368                 typedef typename iterator_traits< OutputIterator >::iterator_category output_iterator_category;
    369                 return detail::copy_impl( first, last, out,
    370                         has_trivial_copy<value_type>::value, iterator_category(), output_iterator_category() );
    371         }
    372 
    373         template< class InputIterator, class OutputIterator >
    374         inline OutputIterator copy_n( InputIterator first, size_t n, OutputIterator out )
    375         {
    376                 typedef typename iterator_traits< InputIterator >::value_type value_type;
    377                 typedef typename iterator_traits< InputIterator >::iterator_category input_iterator_category;
    378                 typedef typename iterator_traits< OutputIterator >::iterator_category output_iterator_category;
    379                 return detail::copy_n_impl( first, n, out,
    380                         has_trivial_copy<value_type>::value, iterator_category(), output_iterator_category() );
    381         }
    382 
    383189}
    384190
Note: See TracChangeset for help on using the changeset viewer.