#pragma once #include "c10/util/Registry.h" #include "caffe2/core/blob.h" #include #include namespace caffe2 { struct BlobStatGetter { virtual size_t sizeBytes(const Blob& blob) const = 0; virtual ~BlobStatGetter() {} }; struct BlobStatRegistry { private: std::unordered_map> map_; void doRegister(TypeIdentifier id, std::unique_ptr&& v); public: template struct Registrar { Registrar() { BlobStatRegistry::instance().doRegister( TypeMeta::Id(), std::unique_ptr(new Getter)); } }; const BlobStatGetter* get(TypeIdentifier id); static BlobStatRegistry& instance(); }; #define REGISTER_BLOB_STAT_GETTER(Type, BlobStatGetterClass) \ static BlobStatRegistry::Registrar \ C10_ANONYMOUS_VARIABLE(BlobStatRegistry) namespace BlobStat { /** * Return size in bytes of the blob, if available for a blob of given type. * If not available, return 0. */ CAFFE2_API size_t sizeBytes(const Blob& blob); } }