diff --git a/allocation_failed_expression_node.h b/allocation_failed_expression_node.h new file mode 100644 index 000000000..4e33c71d1 --- /dev/null +++ b/allocation_failed_expression_node.h @@ -0,0 +1,22 @@ +#ifndef ALLOCATION_FAILED_EXPRESSION_NODE_H +#define ALLOCATION_FAILED_EXPRESSION_NODE_H + +#include "expression_node.h" + +class AllocationFailedExpressionNode : public ExpressionNode { +public: + // ExpressionNode + float approximate() override { return -1; } // Should return nan + + // TreeNode + size_t size() const override { return sizeof(AllocationFailedExpressionNode); } + const char * description() const override { return "Allocation Failed"; } + int numberOfChildren() const override { return 0; } +}; + +class AllocationFailedExpressionRef : public ExpressionReference { +public: + AllocationFailedExpressionRef() : ExpressionReference() {} +}; + +#endif diff --git a/refs.h b/refs.h new file mode 100644 index 000000000..7135baceb --- /dev/null +++ b/refs.h @@ -0,0 +1,8 @@ +#include "addition_node.h" +#include "allocation_failed_expression_node.h" +#include "float_node.h" + +#include "char_layout_node.h" +#include "horizontal_layout_node.h" + +#include "layout_cursor.h" diff --git a/test.cpp b/test.cpp index 22c08bb6f..0d472e05a 100644 --- a/test.cpp +++ b/test.cpp @@ -1,8 +1,4 @@ -#include "float_node.h" -#include "char_layout_node.h" -#include "horizontal_layout_node.h" -#include "addition_node.h" -#include "layout_cursor.h" +#include "refs.h" #include AdditionRef buildAddition() { @@ -98,6 +94,20 @@ void testCursorMoveLeft() { assert(aChar.nodeRetainCount() == 3); } +void testPoolAllocationFail() { + printf("Pool allocation fail test\n"); + + // Fill the pool for size 256 + + // Allocation fail + assert(TreePool::sharedPool()->numberOfNodes() == 0); + AllocationFailedExpressionRef a; + assert(TreePool::sharedPool()->numberOfNodes() == 1); + + /*Expression e = ; + e.simplify*/ +} + typedef void (test)(); void runTest(test t) { assert(TreePool::sharedPool()->numberOfNodes() == 0); @@ -106,9 +116,12 @@ void runTest(test t) { } int main() { + printf("\n*******************\nStart running tests\n*******************\n\n"); runTest(testAddition); runTest(testPoolEmpties); runTest(testCursorCreateAndRetain); runTest(testCursorMoveLeft); + runTest(testPoolAllocationFail); + printf("\n*******************\nEnd of tests\n*******************\n\n"); return 0; } diff --git a/tree_pool.h b/tree_pool.h index 0f5cbafe3..41b9770d8 100644 --- a/tree_pool.h +++ b/tree_pool.h @@ -21,7 +21,9 @@ public: return nullptr; // TODO return static node "failedAllocation" } void * ptr = alloc(sizeof(T)); - // TODO handle allocation problem! + if (ptr == nullptr) { + return nullptr; + } T * node = new(ptr) T(); node->rename(nodeIdentifier); registerNode(node);