添加操作内存的工具函数

This commit is contained in:
邹晓航
2014-09-19 12:30:23 +08:00
parent 2fb1fbaf68
commit 39822ddfbe
2 changed files with 103 additions and 1 deletions

View File

@@ -0,0 +1,102 @@
#ifndef _UNINITIALIZED_FUNCTIONS_H_
#define _UNINITIALIZED_FUNCTIONS_H_
#include "Construct.h"
#include "Iterator.h"
#include "TypeTraits.h"
#include <cstring>
namespace TinySTL{
/***************************************************************************/
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _true_type);
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _false_type);
template<class InputIterator, class ForwardIterator>
ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, ForwardIterator result){
typedef typename _type_traits<iterator_traits<InputIterator>::value_type>::is_POD_type isPODType;
return _uninitialized_copy_aux(first, last, result, isPODType());
}
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _true_type){
memcpy(result, first, (last - first) * sizeof(*first));
return result + (last - first);
}
template<class InputIterator, class ForwardIterator>
ForwardIterator _uninitialized_copy_aux(InputIterator first, InputIterator last,
ForwardIterator result, _false_type){
int i = 0;
for (; first != last; ++first, ++i){
construct((result + i), *first);
}
return (result + i);
}
/***************************************************************************/
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _true_type);
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _false_type);
template<class ForwardIterator, class T>
void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T& value){
typedef typename _type_traits<T>::is_POD_type isPODType;
_uninitialized_fill_aux(first, last, value, isPODType());
}
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _true_type){
//TODO
//<2F><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>fill<6C><6C><EFBFBD><EFBFBD>
std::fill(first, last, value);
}
template<class ForwardIterator, class T>
void _uninitialized_fill_aux(ForwardIterator first, ForwardIterator last,
const T& value, _false_type){
int i = 0;
for (; first != last; ++first, ++i){
construct(first, value);
}
}
/***************************************************************************/
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
Size n, const T& x, _true_type);
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
Size n, const T& x, _false_type);
template<class ForwardIterator, class Size, class T>
inline ForwardIterator uninitialized_fill_n(ForwardIterator first,
Size n, const T& x){
typedef typename _type_traits<T>::is_POD_type isPODType;
return _uninitialized_n_fill_aux(first, n, x, isPODType());
}
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
Size n, const T& x, _true_type){
//TODO
//<2F><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>fill_n<5F><6E><EFBFBD><EFBFBD>
return std::fill_n(first, n, x);
}
template<class ForwardIterator, class Size, class T>
ForwardIterator _uninitialized_n_fill_aux(ForwardIterator first,
Size n, const T& x, _false_type){
int i = 0;
for (; i != n;){
construct((first + i), x);
}
return (first + i);
}
}
#endif

View File

@@ -17,7 +17,7 @@ int main(){
auto last = p + 100;
int array[100];
TinySTL::uninitialized_fill_n(array, 100, 88);
for (auto n : array){ cout << n << endl; }
for (auto n : array){ cout << n << endl; }
system("pause");
return 0;
}