align16New.cc
Go to the documentation of this file.
00001 /* align16New.cc
00002  */
00003 #include "osl/misc/align16New.h"
00004 #include <cassert>
00005 #include <cstdlib>
00006 
00007 void * osl::misc::Align16New::operator new(size_t size)
00008 {
00009   char *ptr = ::new char[size+Alignment];
00010   for (int i=0; i<Alignment; ++i) {
00011     if (reinterpret_cast<unsigned long>(ptr + i + 1) % Alignment == 0) {
00012       *(ptr + i) = i + 1;
00013       // std::cerr << ">> " << (long)ptr << " => " << (long)(ptr + i + 1) << "\n";
00014       return ptr + i + 1;
00015     }
00016   }
00017   assert(0);
00018   abort();
00019 }
00020 
00021 void * osl::misc::Align16New::operator new[](size_t size)
00022 {
00023   return operator new(size);
00024 }
00025 
00026 void osl::misc::Align16New::operator delete(void *ptr, size_t /*size*/)
00027 {
00028   char *p = static_cast<char*>(ptr);
00029   int offset = *(p-1);
00030   ::delete(p - offset);
00031   // std::cerr << "<< " << (long)p << " => " << (long)(p - offset) << "\n";
00032 }
00033 
00034 void osl::misc::Align16New::operator delete[](void *ptr, size_t size)
00035 {
00036   return operator delete(ptr, size);
00037 }
00038 
00039 // ;;; Local Variables:
00040 // ;;; mode:c++
00041 // ;;; c-basic-offset:2
00042 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines