1 #ifndef VIRTMEM_UTILS_HPP 
    2 #define VIRTMEM_UTILS_HPP 
   18 namespace private_utils {
 
   20 template <
typename T, 
typename T2> 
struct TSameType { 
static const bool flag = 
false; };
 
   21 template <
typename T> 
struct TSameType<T, T> { 
static const bool flag = 
true; };
 
   23 template <
typename T> 
struct TVirtPtrTraits { };
 
   25 template <
typename T, 
typename A> 
struct TVirtPtrTraits<VPtr<T, A> >
 
   27     typedef VPtrLock<VPtr<T, A> > Lock;
 
   29     static bool isWrapped(VPtr<T, A> p) { 
return p.isWrapped(); }
 
   30     static T *unwrap(VPtr<T, A> p) { 
return p.unwrap(); }
 
   31     static bool isVirtPtr(
void) { 
return true; }
 
   32     static Lock makeLock(VPtr<T, A> w, 
VirtPageSize s, 
bool ro=
false)
 
   34     static VirtPageSize getLockSize(Lock &l) { 
return l.getLockSize(); }
 
   36     { 
return A::getInstance()->getBigPageSize(); }
 
   40 template <
typename T> 
struct TVirtPtrTraits<T *>
 
   44     static bool isWrapped(T *) { 
return false; }
 
   45     static T *unwrap(T *p) { 
return p; }
 
   46     static bool isVirtPtr(
void) { 
return false; }
 
   47     static Lock makeLock(T *&p, 
VirtPageSize, __attribute__ ((unused)) 
bool ro=
false) { 
return &p; }
 
   52 template <
typename T1, 
typename T2, 
typename A> 
int ptrDiff(VPtr<T1, A> p1, VPtr<T2, A> p2) { 
return p2 - p1; }
 
   53 template <
typename T1, 
typename T2> 
int ptrDiff(T1 *p1, T2 *p2) { 
return p2 - p1; }
 
   54 template <
typename T1, 
typename T2> 
int ptrDiff(T1, T2) { 
return 0; } 
 
   55 template <
typename T1, 
typename T2, 
typename A> 
bool ptrEqual(VPtr<T1, A> p1, VPtr<T2, A> p2) { 
return p1 == p2; }
 
   56 template <
typename T1, 
typename T2> 
bool ptrEqual(T1 *p1, T2 *p2) { 
return p1 == p2; }
 
   57 template <
typename T1, 
typename T2> 
bool ptrEqual(T1, T2) { 
return false; } 
 
   59 template <
typename T1, 
typename T2> 
VirtPageSize getMaxLockSize(T1 p1, T2 p2)
 
   61     VirtPageSize ret = minimal(TVirtPtrTraits<T1>::getPageSize(), TVirtPtrTraits<T2>::getPageSize());
 
   64     if (TSameType<T1, T2>::flag && TVirtPtrTraits<T1>::isVirtPtr())
 
   65         ret = minimal(ret, static_cast<VirtPageSize>(abs(ptrDiff(p1, p2))));
 
   72 typedef bool (*RawCopier)(
char *, 
const char *, 
VPtrSize);
 
   75 template <
typename T1, 
typename T2> T1 rawCopy(T1 dest, T2 src, 
VPtrSize size,
 
   78     if (size == 0 || ptrEqual(dest, src))
 
   81 #ifdef VIRTMEM_WRAP_CPOINTERS 
   82     if (!TVirtPtrTraits<T1>::isVirtPtr() && !TVirtPtrTraits<T2>::isVirtPtr())
 
   85         copier(TVirtPtrTraits<T1>::unwrap(dest), TVirtPtrTraits<T2>::unwrap(src), size);
 
   88     else if (TVirtPtrTraits<T1>::isWrapped(dest) && TVirtPtrTraits<T2>::isWrapped(src))
 
   90         copier(TVirtPtrTraits<T1>::unwrap(dest), TVirtPtrTraits<T2>::unwrap(src), size);
 
   93     else if (TVirtPtrTraits<T1>::isWrapped(dest))
 
   95         rawCopy(TVirtPtrTraits<T1>::unwrap(dest), src, size, copier);
 
   98     else if (TVirtPtrTraits<T2>::isWrapped(src))
 
   99         return rawCopy(dest, TVirtPtrTraits<T2>::unwrap(src), size, copier);
 
  103     const VirtPageSize maxlocksize = getMaxLockSize(dest, src);
 
  109         VirtPageSize cpsize = minimal(static_cast<VPtrSize>(maxlocksize), sizeleft);
 
  111         typename TVirtPtrTraits<T1>::Lock l1 = TVirtPtrTraits<T1>::makeLock(p1, cpsize);
 
  112         cpsize = minimal(cpsize, TVirtPtrTraits<T1>::getLockSize(l1));
 
  113         typename TVirtPtrTraits<T2>::Lock l2 = TVirtPtrTraits<T2>::makeLock(p2, cpsize, 
true);
 
  114         cpsize = minimal(cpsize, TVirtPtrTraits<T2>::getLockSize(l2));
 
  116         if (!copier(*l1, *l2, cpsize))
 
  119         p1 += cpsize; p2 += cpsize;
 
  121         ASSERT(sizeleft <= size);
 
  128 typedef int (*RawComparator)(
const char *, 
const char *, 
VPtrSize, 
bool &);
 
  131 template <
typename T1, 
typename T2> 
int rawCompare(T1 p1, T2 p2, VPtrSize n, RawComparator comparator)
 
  133     if (n == 0 || ptrEqual(p1, p2))
 
  138 #ifdef VIRTMEM_WRAP_CPOINTERS 
  139     if (!TVirtPtrTraits<T1>::isVirtPtr() && !TVirtPtrTraits<T2>::isVirtPtr())
 
  142         return comparator(TVirtPtrTraits<T1>::unwrap(p1), TVirtPtrTraits<T2>::unwrap(p2), n, done);
 
  144     else if (TVirtPtrTraits<T1>::isWrapped(p1) && TVirtPtrTraits<T2>::isWrapped(p2))
 
  145         return comparator(TVirtPtrTraits<T1>::unwrap(p1), TVirtPtrTraits<T2>::unwrap(p2), n, done);
 
  146     else if (TVirtPtrTraits<T1>::isWrapped(p1))
 
  147         return rawCompare(TVirtPtrTraits<T1>::unwrap(p1), p2, n, comparator);
 
  148     else if (TVirtPtrTraits<T2>::isWrapped(p2))
 
  149         return rawCompare(p1, TVirtPtrTraits<T2>::unwrap(p2), n, comparator);
 
  152     VPtrSize sizeleft = n;
 
  153     const VirtPageSize maxlocksize = getMaxLockSize(p1, p2);
 
  157         VirtPageSize cmpsize = minimal(static_cast<VPtrSize>(maxlocksize), sizeleft);
 
  158         typename TVirtPtrTraits<T1>::Lock l1 = TVirtPtrTraits<T1>::makeLock(p1, cmpsize, 
true);
 
  159         cmpsize = minimal(cmpsize, TVirtPtrTraits<T1>::getLockSize(l1));
 
  160         typename TVirtPtrTraits<T2>::Lock l2 = TVirtPtrTraits<T2>::makeLock(p2, cmpsize, 
true);
 
  161         cmpsize = minimal(cmpsize, TVirtPtrTraits<T2>::getLockSize(l2));
 
  163         int cmp = comparator(*l1, *l2, cmpsize, done);
 
  164         if (cmp != 0 || done)
 
  167         p1 += cmpsize; p2 += cmpsize;
 
  169         ASSERT(sizeleft <= n);
 
  175 inline bool memCopier(
char *dest, 
const char *src, VPtrSize n)
 
  177     memcpy(dest, src, n);
 
  181 inline bool strnCopier(
char *dest, 
const char *src, VPtrSize n)
 
  183     return n && (strncpy(dest, src, n))[n-1] != 0; 
 
  186 inline bool strCopier(
char *dest, 
const char *src, VPtrSize n)
 
  197     for (; n; --n, ++d, ++s)
 
  207 inline int memComparator(
const char *p1, 
const char *p2, VPtrSize n, 
bool &)
 
  208 { return ::memcmp(p1, p2, n); }
 
  209 inline int strnComparator(
const char *p1, 
const char *p2, VPtrSize n, 
bool &)
 
  210 { return ::strncmp(p1, p2, n); }
 
  211 inline int strComparator(
const char *p1, 
const char *p2, VPtrSize n, 
bool &done)
 
  213     const int ret = ::strncmp(p1, p2, n);
 
  217         for (; n && *p1; --n, ++p1)
 
  242 template <
typename T1, 
typename A1, 
typename T2, 
typename A2>
 
  243 VPtr<T1, A1> memcpy(VPtr<T1, A1> dest, 
const VPtr<T2, A2> src, VPtrSize size)
 
  245     return static_cast<VPtr<T1, A1> 
>(
 
  246                 private_utils::rawCopy(
static_cast<VPtr<char, A1> 
>(dest),
 
  247                                        static_cast<const VPtr<const char, A2> 
>(src), size,
 
  248                                        private_utils::memCopier));
 
  251 template <
typename T, 
typename A> VPtr<T, A> memcpy(VPtr<T, A> dest, 
const void *src, VPtrSize size)
 
  253     return static_cast<VPtr<T, A> 
>(
 
  254                 private_utils::rawCopy(
static_cast<VPtr<char, A> 
>(dest),
 
  255                                        static_cast<const char *>(src), size,
 
  256                                        private_utils::memCopier));
 
  259 template <
typename T, 
typename A> 
void *memcpy(
void *dest, VPtr<T, A> src, VPtrSize size)
 
  261     return private_utils::rawCopy(static_cast<char *>(dest),
 
  262                                   static_cast<const VPtr<const char, A> 
>(src), size,
 
  263                                   private_utils::memCopier);
 
  266 template <
typename A> VPtr<char, A> memset(VPtr<char, A> dest, 
int c, VPtrSize size)
 
  271 #ifdef VIRTMEM_WRAP_CPOINTERS 
  272     if (dest.isWrapped())
 
  274         ::memset(dest.unwrap(), c, size);
 
  279     VPtrSize sizeleft = size;
 
  280     VPtr<char, A> p = dest;
 
  284         VirtPageSize setsize = private_utils::minimal((VPtrSize)A::getInstance()->getBigPageSize(), sizeleft);
 
  286         setsize = l.getLockSize();
 
  287         ::memset(*l, c, setsize);
 
  288         p += setsize; sizeleft -= setsize;
 
  294 template <
typename T, 
typename A> VPtr<T, A> memset(VPtr<T, A> dest, 
int c, VPtrSize size)
 
  296     return static_cast<VPtr<T, A> 
>(memset(
static_cast<VPtr<char, A> 
>(dest), c, size));
 
  299 template <
typename T1, 
typename A1, 
typename T2, 
typename A2> 
int memcmp(VPtr<T1, A1> s1, 
const VPtr<T2, A2> s2,
 
  302 #ifdef VIRTMEM_WRAP_CPOINTERS 
  303     if (s1.isWrapped() && s2.isWrapped())
 
  304         return ::memcmp(s1.unwrap(), s2.unwrap(), n);
 
  307     return private_utils::rawCompare(
static_cast<VPtr<const char, A1> 
>(s1),
 
  308                                      static_cast<VPtr<const char, A2> 
>(s2), n, private_utils::memComparator);
 
  311 template <
typename T, 
typename A> 
int memcmp(VPtr<T, A> s1, 
const void *s2, VPtrSize n)
 
  313     return private_utils::rawCompare(
static_cast<VPtr<const char, A> 
>(s1),
 
  314                                      static_cast<const char *>(s2), n, private_utils::memComparator);
 
  317 template <
typename T, 
typename A> 
int memcmp(
const void *s1, 
const VPtr<T, A> s2, VPtrSize n)
 
  319     return private_utils::rawCompare(static_cast<const char *>(s1),
 
  320                                      static_cast<VPtr<const char, A> 
>(s2), n, private_utils::memComparator);
 
  323 template <
typename A1, 
typename A2> VPtr<char, A1> strncpy(VPtr<char, A1> dest, 
const VPtr<const char, A2> src,
 
  326     return private_utils::rawCopy(dest, src, n, private_utils::strnCopier);
 
  329 template <
typename A> VPtr<char, A> strncpy(VPtr<char, A> dest, 
const char *src, VPtrSize n)
 
  331     return private_utils::rawCopy(dest, src, n, private_utils::strnCopier);
 
  334 template <
typename A> 
char *strncpy(
char *dest, 
const VPtr<const char, A> src, VPtrSize n)
 
  336     return private_utils::rawCopy(dest, src, n, private_utils::strnCopier);
 
  339 template <
typename A1, 
typename A2> VPtr<char, A1> strcpy(VPtr<char, A1> dest, 
const VPtr<const char, A2> src)
 
  341     return private_utils::rawCopy(dest, src, (VPtrSize)-1, private_utils::strCopier);
 
  344 template <
typename A> VPtr<char, A> strcpy(VPtr<char, A> dest, 
const char *src)
 
  346     return private_utils::rawCopy(dest, src, (VPtrSize)-1, private_utils::strCopier);
 
  349 template <
typename A> 
char *strcpy(
char *dest, 
const VPtr<const char, A> src)
 
  351     return private_utils::rawCopy(dest, src, (VPtrSize)-1, private_utils::strCopier);
 
  354 template <
typename A1, 
typename A2> 
int strncmp(VPtr<const char, A1> dest, VPtr<const char, A2> src, VPtrSize n)
 
  355 { 
return private_utils::rawCompare(dest, src, n, private_utils::strnComparator);}
 
  356 template <
typename A> 
int strncmp(VPtr<const char, A> dest, 
const char *src, VPtrSize n)
 
  357 { 
return private_utils::rawCompare(dest, src, n, private_utils::strnComparator); }
 
  358 template <
typename A> 
int strncmp(
const char *dest, VPtr<const char, A> src, VPtrSize n)
 
  359 { 
return private_utils::rawCompare(dest, src, n, private_utils::strnComparator); }
 
  361 template <
typename A1, 
typename A2> 
int strcmp(VPtr<const char, A1> dest, VPtr<const char, A2> src)
 
  362 { 
return private_utils::rawCompare(dest, src, (VPtrSize)-1, private_utils::strComparator); }
 
  363 template <
typename A> 
int strcmp(
const char *dest, VPtr<const char, A> src)
 
  364 { 
return private_utils::rawCompare(dest, src, (VPtrSize)-1, private_utils::strComparator); }
 
  365 template <
typename A> 
int strcmp(VPtr<const char, A> dest, 
const char *src)
 
  366 { 
return private_utils::rawCompare(dest, src, (VPtrSize)-1, private_utils::strComparator); }
 
  368 template <
typename A> 
int strlen(VPtr<const char, A> str)
 
  370 #ifdef VIRTMEM_WRAP_CPOINTERS 
  372         return ::strlen(str.unwrap());
 
  376     for (; *str != 0; ++str)
 
  384 template <
typename A1, 
typename A2> VPtr<char, A1> strncpy(VPtr<char, A1> dest, 
const VPtr<char, A2> src,
 
  386 { 
return strncpy(dest, 
static_cast<const VPtr<const char, A2> 
>(src), n); }
 
  387 template <
typename A> 
char *strncpy(
char *dest, 
const VPtr<char, A> src, VPtrSize n)
 
  388 { 
return strncpy(dest, 
static_cast<const VPtr<const char, A> 
>(src), n); }
 
  390 template <
typename A1, 
typename A2> VPtr<char, A1> strcpy(VPtr<char, A1> dest, 
const VPtr<char, A2> src)
 
  391 { 
return strcpy(dest, 
static_cast<const VPtr<const char, A2> 
>(src)); }
 
  392 template <
typename A> 
char *strcpy(
char *dest, 
const VPtr<char, A> src)
 
  393 { 
return strcpy(dest, 
static_cast<const VPtr<const char, A> 
>(src)); }
 
  395 template <
typename A1, 
typename A2> 
int strncmp(VPtr<char, A1> dest, VPtr<char, A2> src, VPtrSize n)
 
  396 { 
return strncmp(
static_cast<VPtr<const char, A1> 
>(dest), 
static_cast<VPtr<const char, A2> 
>(src), n); }
 
  397 template <
typename A1, 
typename A2> 
int strncmp(VPtr<const char, A1> dest, VPtr<char, A2> src, VPtrSize n)
 
  398 { 
return strncmp(dest, 
static_cast<VPtr<const char, A2> 
>(src), n); }
 
  399 template <
typename A1, 
typename A2> 
int strncmp(VPtr<char, A1> dest, VPtr<const char, A2> src, VPtrSize n)
 
  400 { 
return strncmp(
static_cast<VPtr<const char, A1> 
>(dest), src, n); }
 
  401 template <
typename A> 
int strncmp(
const char *dest, VPtr<char, A> src, VPtrSize n)
 
  402 { 
return strncmp(dest, 
static_cast<VPtr<const char, A> 
>(src), n); }
 
  403 template <
typename A> 
int strncmp(VPtr<char, A> dest, 
const char *src, VPtrSize n)
 
  404 { 
return strncmp(
static_cast<VPtr<const char, A> 
>(dest), src, n); }
 
  406 template <
typename A1, 
typename A2> 
int strcmp(VPtr<char, A1> dest, VPtr<char, A2> src)
 
  407 { 
return strcmp(
static_cast<VPtr<const char, A1> 
>(dest), 
static_cast<VPtr<const char, A2> 
>(src)); }
 
  408 template <
typename A1, 
typename A2> 
int strcmp(VPtr<const char, A1> dest, VPtr<char, A2> src)
 
  409 { 
return strcmp(dest, 
static_cast<VPtr<const char, A2> 
>(src)); }
 
  410 template <
typename A1, 
typename A2> 
int strcmp(VPtr<char, A1> dest, VPtr<const char, A2> src)
 
  411 { 
return strcmp(
static_cast<VPtr<const char, A1> 
>(dest), src); }
 
  412 template <
typename A> 
int strcmp(
const char *dest, VPtr<char, A> src)
 
  413 { 
return strcmp(dest, 
static_cast<VPtr<const char, A> 
>(src)); }
 
  414 template <
typename A> 
int strcmp(VPtr<char, A> dest, 
const char *src)
 
  415 { 
return strcmp(
static_cast<VPtr<const char, A> 
>(dest), src); }
 
  417 template <
typename A> 
int strlen(VPtr<char, A> str) { 
return strlen(
static_cast<VPtr<const char, A> 
>(str)); }
 
  423 #endif // VIRTMEM_UTILS_HPP 
contains all code from virtmem 
Definition: base_alloc.cpp:22
This header file contains several variables that can be used to customize virtmem. 
uint16_t VirtPageSize
Numeric type used to store the size of a virtual memory page. 
Definition: base_alloc.h:23
This header contains the class definition of the VPtr class. 
VPtrLock< T > makeVirtPtrLock(const T &w, VirtPageSize s, bool ro=false)
Creates a virtual lock (shortcut) 
Definition: vptr_utils.h:175
uint32_t VPtrSize
Numeric type used to store the size of a virtual memory block. 
Definition: base_alloc.h:22