include/core/CMemoryDecStd.h (72 lines of code) (raw):
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the following additional limitation. Functionality enabled by the
* files subject to the Elastic License 2.0 may only be used in production when
* invoked by an Elasticsearch process with a license key installed that permits
* use of machine learning features. You may not use this file except in
* compliance with the Elastic License 2.0 and the foregoing additional
* limitation.
*/
#ifndef INCLUDED_ml_core_CMemoryDecStd_h
#define INCLUDED_ml_core_CMemoryDecStd_h
#include <core/CMemoryDec.h>
#include <deque>
#include <list>
#include <map>
#include <set>
namespace ml {
namespace core {
namespace memory {
template<typename T, typename A>
constexpr std::size_t storageNodeOverhead(const std::list<T, A>&) {
// std::list uses 2 pointers per list node (prev and next pointers).
return 2 * sizeof(std::size_t);
}
template<typename K, typename V, typename C, typename A>
constexpr std::size_t storageNodeOverhead(const std::map<K, V, C, A>&) {
// std::map appears to use 4 pointers/size_ts per tree node
// (colour, parent, left and right child pointers).
return 4 * sizeof(std::size_t);
}
template<typename K, typename V, typename C, typename A>
constexpr std::size_t storageNodeOverhead(const std::multimap<K, V, C, A>&) {
// In practice, both std::multimap and std::map use the same
// rb tree implementation.
return 4 * sizeof(std::size_t);
}
template<typename T, typename C, typename A>
constexpr std::size_t storageNodeOverhead(const std::set<T, C, A>&) {
// std::set appears to use 4 pointers/size_ts per tree node
// (colour, parent, left and right child pointers).
return 4 * sizeof(std::size_t);
}
template<typename T, typename C, typename A>
constexpr std::size_t storageNodeOverhead(const std::multiset<T, C, A>&) {
// In practice, both std::multiset and std::set use the same
// rb tree implementation.
return 4 * sizeof(std::size_t);
}
template<typename T, typename A>
std::size_t dynamicSize(const std::list<T, A>& t);
template<typename T, typename A>
std::size_t dynamicSize(const std::deque<T, A>& t);
template<typename K, typename V, typename C, typename A>
std::size_t dynamicSize(const std::map<K, V, C, A>& t);
template<typename K, typename V, typename C, typename A>
std::size_t dynamicSize(const std::multimap<K, V, C, A>& t);
template<typename T, typename C, typename A>
std::size_t dynamicSize(const std::set<T, C, A>& t);
template<typename T, typename C, typename A>
std::size_t dynamicSize(const std::multiset<T, C, A>& t);
}
namespace memory_debug {
template<typename T, typename A>
void dynamicSize(const char* name,
const std::list<T, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
template<typename T, typename C, typename A>
void dynamicSize(const char* name,
const std::deque<T, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
template<typename K, typename V, typename C, typename A>
void dynamicSize(const char* name,
const std::map<K, V, C, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
template<typename K, typename V, typename C, typename A>
void dynamicSize(const char* name,
const std::multimap<K, V, C, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
template<typename T, typename C, typename A>
void dynamicSize(const char* name,
const std::set<T, C, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
template<typename T, typename C, typename A>
void dynamicSize(const char* name,
const std::multiset<T, C, A>& t,
const CMemoryUsage::TMemoryUsagePtr& mem);
}
}
}
#endif // INCLUDED_ml_core_CMemoryDecStd_h