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

其他游戏

开发平台:

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_INDEX_SET_H
  9. #define HK_INDEX_SET_H
  10. /// Holds a unique set of int indices.
  11. ///
  12. /// This implements a 'mathematical' style set of int values or 'indices'.
  13. ///
  14. /// A set either contains or does not contain an index. Sets can be combined via the standard set
  15. /// operations of setIntersection, setUnion and setDifference. This operations are designed to be relatively
  16. /// fast. Note that the sets passed in cannot be the same as the set that is being modified.
  17. ///
  18. /// Its possible to modify the contents using startUpdate/endUpdate. Members can be added/removed from the
  19. /// set by manipulating the array. Doing endUpdate will sort the members, and remove any duplicates.
  20. ///
  21. /// The implementation holds the indices held in the set in a sorted array. Having a sorted list, allows for fast
  22. /// comparison, and the boolean operations. It also allows relatively fast containment tesing - using a binary chop
  23. /// giving O(log2(n)) performance.
  24. class hkIndexSet
  25. {
  26.     public:
  27.         HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_SCENE_DATA, hkIndexSet);
  28.             /// Returns the index of index if found, else -1 if not
  29.             /// Complexity - O(log(n)) n is is size of set
  30.         int findIndex(int index) const;
  31.             /// Returns true if the set contains the index
  32.             /// Complexity - O(log(n)) n is is size of set
  33.         hkBool contains(int index) const { return findIndex(index) >= 0; }
  34.             /// Returns the indices which are in both sets
  35.             /// Complexity O(n + m) n is size of a, m is size of b
  36.         void setIntersection(const hkIndexSet& a, const hkIndexSet& b);
  37.             /// Returns the union of both sets
  38.             /// Complexity O(n + m) n is size of a, m is size of b
  39.         void setUnion(const hkIndexSet& a, const hkIndexSet& b);
  40.             /// Set the set as the members of a minus the members of b
  41.             /// Complexity O(n + m) n is size of a, m is size of b
  42.         void setDifference(const hkIndexSet& a, const hkIndexSet& b);
  43.             /// Read only access to contained indices
  44.         const hkArray<int>& getIndices() const { return m_indices; }
  45.             /// Start updating the contents
  46.             /// Complexity - O(1)
  47.         hkArray<int>& startUpdate();
  48.             /// End the update
  49.             /// Complexity - O(n), will reorder indices and remove duplicates
  50.         void endUpdate();
  51.             /// Get the number of indices. Note the can be incorrect in an update if there are repeated indices.
  52. int getSize() const { return m_indices.getSize(); }
  53.             /// Remove a value (can only be done in an update)
  54.             /// Complextiy - O(n)
  55.         void removeIndex(int index);
  56.             /// Add a value (can only be done in an update)
  57.             /// Complexity O(1). Note that each addition will consume memory, duplicates are only removed in the end update
  58.         void addIndex(int index);
  59.             /// Remove all of the contents
  60.         void clear() { m_indices.clear(); }
  61.             /// Optimizes memory allocation
  62.         void optimizeAllocation();
  63.             /// Clears and deallocates
  64.         void clearAndDeallocate() { m_indices.clearAndDeallocate(); }
  65.             /// Swap
  66.         void swap(hkIndexSet& rhs) { m_indices.swap(rhs.m_indices); }
  67.             /// Returns true if the index sets are the same
  68.         hkBool operator==(const hkIndexSet& rhs) const;
  69.             /// Returns true if the index sets are not equal
  70.         hkBool operator!=(const hkIndexSet& rhs) const { return !(*this == rhs); }
  71.             /// Assignment
  72.         void operator=(const hkIndexSet& rhs);
  73.             /// Calculate the number members of both this and the parameter
  74.         int calculateNumIntersecting(const hkIndexSet& rhs) const;
  75.             /// Calculate the total unique members in both
  76.         int calculateNumUnion(const hkIndexSet& rhs) const;
  77.             /// Ctor
  78.         hkIndexSet();
  79.             /// Copy ctor
  80.         hkIndexSet(const hkIndexSet& rhs);
  81.             /// Calculates the number of members which intersect and are union
  82.         static void HK_CALL calculateNumIntersectAndUnion(const hkIndexSet& setA, const hkIndexSet& setB, int& numIntersectOut, int& numUnionOut);
  83. #ifdef HK_DEBUG
  84.         // Used to test this class is functioning correctly
  85.         static void HK_CALL selfTest();
  86. #endif
  87.     protected:
  88.         hkArray<int> m_indices;
  89.         hkBool m_inUpdate;
  90. };
  91. #endif // HK_INDEX_SET_H
  92. /*
  93. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  94. * Confidential Information of Havok.  (C) Copyright 1999-2009
  95. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  96. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  97. * rights, and intellectual property rights in the Havok software remain in
  98. * Havok and/or its suppliers.
  99. * Use of this software for evaluation purposes is subject to and indicates
  100. * acceptance of the End User licence Agreement for this product. A copy of
  101. * the license is included with this software and is also available at www.havok.com/tryhavok.
  102. */