hkAnderssonTree.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:4k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_ANDERSSON_TREE_H
  9. #define HK_ANDERSSON_TREE_H
  10. /// An Arne Andersson tree (AA tree) is a balanced red-black tree with one additional rule.
  11. /// Unlike red-black trees, RED nodes on an AA tree can only be added as a right subchild. In other words,
  12. /// no RED node can be a left subchild. This results in the simulation of a 2-3 tree instead of a 2-3-4 tree,
  13. /// which greatly simplifies the maintenance operations. The maintenance algorithms for a red-black tree
  14. /// need to consider seven different shapes to properly balance the tree. An AA tree on the other hand only
  15. /// needs to consider two shapes due to the strict requirement that only right links can be red.
  16. /// See http://en.wikipedia.org/w/index.php?title=AA_tree&oldid=148001972
  17. // Tallest allowable tree, ie. 2^64 branches
  18. #ifndef HK_AA_TREE_HEIGHT_LIMIT
  19. #define HK_AA_TREE_HEIGHT_LIMIT 64
  20. #endif
  21. class hkAATree
  22. {
  23. public:
  24. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_TREE, hkAATree);
  25. // user-defined item handling
  26. typedef int   (HK_CALL *compareFunc) ( const void *p1, const void *p2 );
  27. typedef void* (HK_CALL *cloneFunc)   ( void *p );
  28. typedef void  (HK_CALL *destroyFunc) ( void *p );
  29. // default item handling
  30. static int   HK_CALL defaultCompare(const void* p1, const void* p2);
  31. static void* HK_CALL defaultClone(void* p);
  32. static void  HK_CALL defaultDestroy(void* p);
  33. hkAATree( compareFunc cmp=defaultCompare, cloneFunc dup=defaultClone, destroyFunc rel=defaultDestroy );
  34. ~hkAATree();
  35. // tree functions
  36. void* find( void* data ) const;
  37. hkBool insert( void* data );
  38. hkBool erase( void *data );
  39. HK_FORCE_INLINE hkUint32 getSize() const;
  40. void clear();
  41. protected:
  42. struct Node
  43. {
  44. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_TREE, hkAATree::Node);
  45. int          m_level;   // Horizontal level for balance
  46. void *       m_data;    // User-defined content
  47. struct Node* m_link[2]; // Left (0) and right (1) links
  48. };
  49. // tree traversal
  50. public:
  51. struct Iterator
  52. {
  53. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_TREE, hkAATree::Iterator);
  54. hkAATree* m_tree;    // Paired tree
  55. Node*     m_it;                            // Current node
  56. Node*     m_path[HK_AA_TREE_HEIGHT_LIMIT]; // Traversal path
  57. hkUint32  m_top;                           // Top of stack
  58. void* start( hkAATree* tree, int dir );
  59. void* move( int dir );
  60. HK_FORCE_INLINE void* first( hkAATree* tree );
  61. HK_FORCE_INLINE void* last( hkAATree* tree );
  62. HK_FORCE_INLINE void* next();
  63. HK_FORCE_INLINE void* prev();
  64. };
  65. Node *       m_root; // Top of the tree
  66. Node *       m_nil;  // End of tree sentinel
  67. protected:
  68. HK_FORCE_INLINE Node* newNode( void *data );
  69. HK_FORCE_INLINE void skew(Node** t);
  70. HK_FORCE_INLINE void split(Node** t);
  71. compareFunc  m_cmp;  // Compare two items (user-defined)
  72. cloneFunc    m_dup;  // Clone an item (user-defined)
  73. destroyFunc  m_rel;  // Destroy an item (user-defined)
  74. hkUint32     m_size; // Number of items in the tree
  75. };
  76. #include <Common/Base/Container/Tree/hkAnderssonTree.inl>
  77. #endif //HK_ANDERSSON_TREE_H
  78. /*
  79. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  80. * Confidential Information of Havok.  (C) Copyright 1999-2009
  81. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  82. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  83. * rights, and intellectual property rights in the Havok software remain in
  84. * Havok and/or its suppliers.
  85. * Use of this software for evaluation purposes is subject to and indicates
  86. * acceptance of the End User licence Agreement for this product. A copy of
  87. * the license is included with this software and is also available at www.havok.com/tryhavok.
  88. */