unsafe void PushSame(Node *node, TestPair *stack, ref int count)
        {
            var element = stack + count++;

            element->A    = node;
            element->Type = PairType.SameNode;
        }
        unsafe void PushDifferent(Node *a, Node *b, TestPair *stack, ref int count)
        {
            var element = stack + count++;

            element->A    = a;
            element->B    = b;
            element->Type = PairType.InternalInternal;
        }
 unsafe void TestDifferent <TResultList>(int a, int b, BoundingBox *aBounds, BoundingBox *bBounds, TestPair *stack, ref int nextToVisit, ref TResultList results) where TResultList : IList <Overlap>
 {
     if (a >= 0)
     {
         if (b >= 0)
         {
             //both internal nodes
             PushDifferent(nodes + a, nodes + b, stack, ref nextToVisit);
         }
         else
         {
             //leaf and internal
             PushLeafInternal(nodes + a, bBounds, b, stack, ref nextToVisit);
         }
     }
     else if (b >= 0)
     {
         //leaf and internal
         PushLeafInternal(nodes + b, aBounds, a, stack, ref nextToVisit);
     }
     else
     {
         //two leaves
         results.Add(new Overlap {
             A = Encode(a), B = Encode(b)
         });
     }
 }
        unsafe void PushLeafInternal(Node *internalNode, BoundingBox *leafBounds, int encodedLeafIndex, TestPair *stack, ref int count)
        {
            var element = stack + count++;

            element->A                = internalNode;
            element->LeafBounds       = leafBounds;
            element->EncodedLeafIndex = encodedLeafIndex;
            element->Type             = PairType.LeafInternal;
        }