void PrintMuscle(tMuscle muscle)
{
	PrintCommonInfo(muscle.commonInfo);
	printf("\n\tType: %s ", MuscleTypes[muscle.type]);
	printf("\n\tFunction: %s ", muscle.function);
	printf("\n*******************************\n\n");
}
void PrintBone(tBone bone)
{
	PrintCommonInfo(bone.commonInfo);
	printf("\n\tDensity: %.2f ", bone.density);
	printf("\n\tNumber of associated muscles: %d ", bone.nMusc);
	printf("\n*******************************\n\n");
}
void SeparateChainingHash::PrintInfo() const
{
    size_t maxChainSize = GetChainSize(pChains[0]);
    size_t sumOfSizes = maxChainSize;
    size_t minChainSize = maxChainSize;

    for (size_t i = 1; i < ChainsCount; i++)
    {
        size_t size = GetChainSize(pChains[i]);

        sumOfSizes += size;
        maxChainSize = std::max(maxChainSize, size);
        minChainSize = std::min(minChainSize, size);
    }

    size_t memoryUsed =
        sizeof(*this) +  // object size
        sizeof(Box*) * ChainsCount + // vector of lists
        sumOfSizes * sizeof(Box); // Nodes allocated for the lists

    size_t dataSize = sumOfSizes * sizeof(int);
    size_t overhead = ((memoryUsed - dataSize) * 100) / memoryUsed;

    std::cout
            << "SeparateChainingHashStl stats:"
            << "\n   - Max chain size: " << maxChainSize
            << "\n   - Avg chain size: " << (sumOfSizes / ChainsCount)
            << "\n   - Min chain size: " << minChainSize
            << "\n   - list node size: " << sizeof(Box);

    PrintCommonInfo(sumOfSizes, memoryUsed);
}
void LinearProbingHash::PrintInfo() const
{
	std::cout
		<< "LinearProbingHash:"
		<< "\n   - Used space: " << (((double)ElementsCount * 100) / BufferSize) << "%";

	PrintCommonInfo(ElementsCount, BufferSize * sizeof(int) + sizeof(*this));
}
void SeparateChainingHashStl::PrintInfo() const
{
    size_t maxChainSize = pChains[0].size();
    size_t sumOfSizes = pChains[0].size();
    size_t minChainSize = pChains[0].size();

    for(size_t i = 1; i < ChainsCount; i++)
    {
        size_t size = pChains[i].size();

        sumOfSizes += size;
        maxChainSize = std::max(maxChainSize, size);
        minChainSize = std::min(minChainSize, size);
    }

    // NOTE: Microsoft specific. Assumes we are storing int elements
    // and  using the default allocator.
    static const size_t stlListNodeSize = sizeof(std::_List_node<int, void*>);

    size_t memoryUsed =
        sizeof(*this) +  // object size
        sizeof(std::list<int>) * ChainsCount + // vector of lists
        sumOfSizes * stlListNodeSize; // Nodes allocated by the lists

    size_t dataSize = sumOfSizes * sizeof(int);
    size_t overhead = ((memoryUsed - dataSize) * 100) / memoryUsed;

    std::cout
            << "SeparateChainingHashStl stats:"
            << "\n   - Max chain size: " << maxChainSize
            << "\n   - Avg chain size: " << (sumOfSizes / ChainsCount)
            << "\n   - Min chain size: " << minChainSize
            << "\n   - std::list node size: " << stlListNodeSize;

    PrintCommonInfo(sumOfSizes, memoryUsed);
}