Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Taudul <wolf.pld@gmail.com>2018-06-19 21:54:46 +0300
committerBartosz Taudul <wolf.pld@gmail.com>2018-06-19 22:16:02 +0300
commit87467a472c11e4c749de2de945648152f08752ee (patch)
tree2dec7e69ff66e6c7882f83ba678844a30d96df8a /server/TracyVarArray.hpp
parent46cc92bd01163fd7f944e3160a1d892d273e16a5 (diff)
Add variable sized const array.
Diffstat (limited to 'server/TracyVarArray.hpp')
-rw-r--r--server/TracyVarArray.hpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/server/TracyVarArray.hpp b/server/TracyVarArray.hpp
new file mode 100644
index 00000000..7d2f7fd8
--- /dev/null
+++ b/server/TracyVarArray.hpp
@@ -0,0 +1,92 @@
+#ifndef __TRACYVARARRAY_HPP__
+#define __TRACYVARARRAY_HPP__
+
+#include <stdint.h>
+
+#include "../common/TracyForceInline.hpp"
+#include "tracy_flat_hash_map.hpp"
+#include "TracyCharUtil.hpp"
+#include "TracyMemory.hpp"
+
+namespace tracy
+{
+
+#pragma pack( 1 )
+template<typename T>
+class VarArray
+{
+public:
+ VarArray( uint8_t size, const T* data )
+ : m_size( size )
+ , m_hash( charutil::hash( (const char*)data, size * sizeof( T ) ) )
+ , m_ptr( data )
+ {
+ }
+
+ VarArray( const VarArray& ) = delete;
+ VarArray( VarArray&& ) = delete;
+
+ VarArray& operator=( const VarArray& ) = delete;
+ VarArray& operator=( VarArray&& ) = delete;
+
+ tracy_force_inline uint32_t get_hash() const { return m_hash; }
+
+ tracy_force_inline bool empty() const { return m_size == 0; }
+ tracy_force_inline uint8_t size() const { return m_size; }
+
+ tracy_force_inline const T* data() const { return m_ptr; };
+
+ tracy_force_inline const T* begin() const { return m_ptr; }
+ tracy_force_inline const T* end() const { return m_ptr + m_size; }
+
+ tracy_force_inline const T& front() const { assert( m_size > 0 ); return m_ptr[0]; }
+ tracy_force_inline const T& back() const { assert( m_size > 0 ); return m_ptr[m_size - 1]; }
+
+ tracy_force_inline const T& operator[]( size_t idx ) const { return m_ptr[idx]; }
+
+private:
+ uint8_t m_size;
+ uint32_t m_hash;
+ const T* m_ptr;
+};
+#pragma pack()
+
+template<typename T>
+bool Compare( const VarArray<T>& lhs, const VarArray<T>& rhs )
+{
+ if( lhs.size() != rhs.size() || lhs.get_hash() != rhs.get_hash() ) return false;
+ const auto sz = lhs.size();
+ for( uint8_t i=0; i<sz; i++ )
+ {
+ if( lhs[i] != rhs[i] ) return false;
+ }
+ return true;
+}
+
+template<typename T>
+struct VarArrayHasher
+{
+ size_t operator()( const VarArray<T>* arr ) const
+ {
+ return arr->get_hash();
+ }
+};
+
+template<typename T>
+struct VarArrayHasherPOT : public VarArrayHasher<T>
+{
+ typedef tracy::power_of_two_hash_policy hash_policy;
+};
+
+template<typename T>
+struct VarArrayComparator
+{
+ bool operator()( const VarArray<T>* lhs, const VarArray<T>* rhs ) const
+ {
+ return Compare( *lhs, *rhs );
+ }
+};
+
+}
+
+#endif