/*
 * Copyright 2014 Google, Inc
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "SkSmallAllocator.h"
#include "SkTypes.h"
#include "Test.h"

class CountingClass {
public:
    CountingClass() {
        kCount++;
    }

    ~CountingClass() {
        kCount--;
    }

    static int GetCount() { return kCount; }

private:
    static int kCount;
};

int CountingClass::kCount;

template<uint32_t kMaxObjects, size_t kBytes> void test_allocator(skiatest::Reporter* reporter) {
    {
        SkSmallAllocator<kMaxObjects, kBytes> alloc;
        for (uint32_t i = 0; i < kMaxObjects; ++i) {
            CountingClass* c = alloc.template createT<CountingClass>();
            REPORTER_ASSERT(reporter, c != NULL);
            REPORTER_ASSERT(reporter, CountingClass::GetCount() == static_cast<int>(i+1));
        }
    }
    REPORTER_ASSERT(reporter, CountingClass::GetCount() == 0);
}

// Tests that ensure that the destructor is called, whether the objects
// were created in fStorage or on the heap.
DEF_TEST(SmallAllocator_destructor, reporter) {
    // Four times as many bytes as objects will never require any heap
    // allocations (since SkAlign4(sizeof(CountingClass)) == 4 and the allocator
    // will stop once it reaches kMaxObjects).
    test_allocator<5, 20>(reporter);
    test_allocator<10, 40>(reporter);
    test_allocator<20, 80>(reporter);

#ifndef SK_DEBUG
    // Allowing less bytes than objects means some will be allocated on the
    // heap. Don't run these in debug where we assert.
    test_allocator<50, 20>(reporter);
    test_allocator<100, 20>(reporter);
#endif
}

class Dummy {
};

class DummyContainer {
public:
    explicit DummyContainer(Dummy* d)
        :fDummy(d)
    {}

    Dummy* getDummy() const { return fDummy; }

private:
    Dummy* fDummy;
};

// Test that using a createT with a constructor taking a pointer as a
// parameter works as expected.
DEF_TEST(SmallAllocator_pointer, reporter) {
    SkSmallAllocator<1, 8> alloc;
    Dummy d;
    DummyContainer* container = alloc.createT<DummyContainer>(&d);
    REPORTER_ASSERT(reporter, container != NULL);
    REPORTER_ASSERT(reporter, container->getDummy() == &d);
}
