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-08-04 17:25:11 +0300
committerBartosz Taudul <wolf.pld@gmail.com>2018-08-04 17:25:11 +0300
commitd2c866377ed712615e822c80cd794039e39d0b3a (patch)
tree9d00aebfb1596b1a28edea7d297cb69cf262dcb4 /server/TracyStringDiscovery.hpp
parente174e2c12af12ac9426bd76ff9e35cf40eefc056 (diff)
Extract unique string discovery from worker.
This class is responsible for handling data sets that should be grouped together, but which may come with different name pointers. It is a generalization of the plot merging functionality.
Diffstat (limited to 'server/TracyStringDiscovery.hpp')
-rw-r--r--server/TracyStringDiscovery.hpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/server/TracyStringDiscovery.hpp b/server/TracyStringDiscovery.hpp
new file mode 100644
index 00000000..36e5cd84
--- /dev/null
+++ b/server/TracyStringDiscovery.hpp
@@ -0,0 +1,80 @@
+#ifndef __TRACYSTRINGDISCOVERY_HPP__
+#define __TRACYSTRINGDISCOVERY_HPP__
+
+#include "../common/TracyForceInline.hpp"
+#include "tracy_flat_hash_map.hpp"
+#include "TracyCharUtil.hpp"
+#include "TracyVector.hpp"
+
+namespace tracy
+{
+
+template<typename T>
+class StringDiscovery
+{
+public:
+ tracy_force_inline Vector<T>& Data() { return m_data; }
+ tracy_force_inline const Vector<T>& Data() const { return m_data; }
+
+ tracy_force_inline bool IsPending() const { return !m_pending.empty(); }
+
+ // Merge( destination, postponed )
+ tracy_force_inline bool StringDiscovered( uint64_t name, const StringLocation& sl, std::function<void(T,T)> Merge )
+ {
+ auto pit = m_pending.find( name );
+ assert( pit != m_pending.end() );
+
+ auto it = m_rev.find( sl.ptr );
+ bool add = it == m_rev.end();
+ if( add )
+ {
+ m_map.emplace( name, pit->second );
+ m_rev.emplace( sl.ptr, pit->second );
+ m_data.push_back( pit->second );
+ }
+ else
+ {
+ auto item = it->second;
+ m_map.emplace( name, item );
+ Merge( item, pit->second );
+ }
+
+ m_pending.erase( pit );
+
+ return add;
+ }
+
+ tracy_force_inline T Retrieve( uint64_t name, std::function<T(uint64_t)> Create, std::function<void(uint64_t)> Query )
+ {
+ auto it = m_map.find( name );
+ if( it == m_map.end() )
+ {
+ auto pit = m_pending.find( name );
+ if( pit == m_pending.end() )
+ {
+ T item = Create( name );
+ m_pending.emplace( name, item );
+ Query( name );
+ return item;
+ }
+ else
+ {
+ return pit->second;
+ }
+ }
+ else
+ {
+ return it->second;
+ }
+ }
+
+private:
+ Vector<T> m_data;
+ flat_hash_map<uint64_t, T, nohash<uint64_t>> m_pending;
+ flat_hash_map<uint64_t, T, nohash<uint64_t>> m_map;
+ flat_hash_map<const char*, T, charutil::HasherPOT, charutil::Comparator> m_rev;
+};
+
+}
+
+#endif