Loki/include/loki/flex/flex_string_details.h
syntheticpp f994398a51 -adding flex_string
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@214 7ec92016-0320-0410-acc4-a06ded1c099a
2005-08-27 10:20:46 +00:00

99 lines
2.4 KiB
C++
Executable file

////////////////////////////////////////////////////////////////////////////////
// flex_string
// Copyright (c) 2001 by Andrei Alexandrescu
// Permission to use, copy, modify, distribute and sell this software for any
// purpose is hereby granted without fee, provided that the above copyright
// notice appear in all copies and that both that copyright notice and this
// permission notice appear in supporting documentation.
// The author makes no representations about the
// suitability of this software for any purpose. It is provided "as is"
// without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////
#ifndef FLEX_STRING_DETAILS_INC_
#define FLEX_STRING_DETAILS_INC_
#include <memory>
namespace flex_string_details
{
template <class InIt, class OutIt>
OutIt copy_n(InIt b, typename std::iterator_traits<InIt>::difference_type n, OutIt d)
{
for (; n != 0; --n, ++b, ++d)
{
*d = *b;
}
return d;
}
template <class Pod, class T>
inline void pod_fill(Pod* b, Pod* e, T c)
{
switch ((e - b) & 7)
{
case 0:
while (b != e)
{
*b = c; ++b;
case 7: *b = c; ++b;
case 6: *b = c; ++b;
case 5: *b = c; ++b;
case 4: *b = c; ++b;
case 3: *b = c; ++b;
case 2: *b = c; ++b;
case 1: *b = c; ++b;
}
}
}
template <class Pod>
inline void pod_move(const Pod* b, const Pod* e, Pod* d)
{
using namespace std;
memmove(d, b, (e - b) * sizeof(*b));
}
template <class Pod>
inline Pod* pod_copy(const Pod* b, const Pod* e, Pod* d)
{
const size_t s = e - b;
using namespace std;
memcpy(d, b, s * sizeof(*b));
return d + s;
}
template <typename T> struct get_unsigned
{
typedef T result;
};
template <> struct get_unsigned<char>
{
typedef unsigned char result;
};
template <> struct get_unsigned<signed char>
{
typedef unsigned char result;
};
template <> struct get_unsigned<short int>
{
typedef unsigned short int result;
};
template <> struct get_unsigned<int>
{
typedef unsigned int result;
};
template <> struct get_unsigned<long int>
{
typedef unsigned long int result;
};
enum Shallow {};
}
#endif // FLEX_STRING_DETAILS_INC_