-adding flex_string
git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@214 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
parent
7d639aff90
commit
f994398a51
8 changed files with 2812 additions and 0 deletions
99
include/loki/flex/flex_string_details.h
Executable file
99
include/loki/flex/flex_string_details.h
Executable file
|
@ -0,0 +1,99 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 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_
|
Loading…
Add table
Add a link
Reference in a new issue