Changeset 388
- Timestamp:
- 06/06/15 16:16:30 (10 years ago)
- Location:
- trunk/nv/stl
- Files:
-
- 5 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/stl/algorithm.hh
r383 r388 10 10 * @brief STL algorithm library 11 11 */ 12 // TODO: implement fill_default!13 12 14 13 #ifndef NV_STL_ALGORITHM_HH 15 14 #define NV_STL_ALGORITHM_HH 16 15 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> 18 20 #include <nv/stl/utility.hh> 19 21 #include <nv/stl/iterator.hh> 20 #include <nv/stl/capi.hh>21 22 22 23 namespace nv … … 186 187 } 187 188 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 detail237 {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 scalars242 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 scalars256 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 scalars270 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 scalars284 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 detail334 {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 383 189 } 384 190
Note: See TracChangeset
for help on using the changeset viewer.