Listing 2: Several classes implementing ScrubPolicy

template <class Scrubber>
class ScrubOnDestroy : Scrubber
{
public:
    inline void onDestroy(void* pmem, size_t numBytes)
    {
        doScrub(pmem, numBytes);
    }

    inline void onDeallocate(void* pmem, size_t numBytes)
    {}
};

template <class Scrubber>
class ScrubOnDeallocate : Scrubber
{
public:
    inline void onDestroy(void* pmem, size_t numBytes)
    {}

    inline void onDeallocate(void* pmem, size_t numBytes)
    {
        doScrub(pmem, numBytes);
    }
};

class BasicScrubber
{
public:
    inline void doScrub(void* pmem, size_t numBytes)
    {
        memset(pmem, 0x00, numBytes);
    }
};

class HeavyScrubber
{
public:
    inline void doScrub(void* pmem, size_t numBytes)
    {
        memset(pmem, 0xAA, numBytes);
        memset(pmem, 0x55, numBytes);
        memset(pmem, 0xFF, numBytes);
        memset(pmem, 0x00, numBytes);
    }
};

class NoScrubber
{
public:
    inline void doScrub(void* pmem, size_t numBytes)    {}
};