summaryrefslogtreecommitdiff
path: root/Runtime/Containers/ConstantStringManager.cpp
blob: 157d98d986fc692bf04aede2dd7ca2701a4cb6d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "UnityPrefix.h"
#include "ConstantStringManager.h"
#include "Runtime/Utilities/InitializeAndCleanup.h"

static ConstantStringManager* gConstantStringManager = NULL;

void ConstantStringManager::ProfileCommonString (const char* str)
{
#if PROFILE_COMMON_STRINGS
	SET_ALLOC_OWNER(this);
	m_CommonStringMutex.Lock();
	m_CommonStringCounter[str]++;
	m_CommonStringMutex.Unlock();
#endif
}

void ConstantStringManager::DumpCommonStrings ()
{
#if PROFILE_COMMON_STRINGS
	for(CommonStringCounter::iterator i=m_CommonStringCounter.begin();i != m_CommonStringCounter.end();++i)
	{
		printf_console("%d\t -> '%s'\n", i->second, i->first.c_str());
	}
#endif
}

ConstantStringManager::ConstantStringManager ()
{
	AddConstantString("");
	AddConstantString("TextMesh");
}

ConstantStringManager::~ConstantStringManager ()
{
	for (int i=0;i<m_Strings.size();i++)
	{
		UNITY_FREE(kMemStaticString, (void*)m_Strings[i]);
	}
}

const char* ConstantStringManager::GetEmptyString()
{
	return m_Strings[0];
}

const char* ConstantStringManager::GetConstantString(const char* str)
{
	ProfileCommonString (str);
	
	for (int i=0;i<m_Strings.size();i++)
	{
		if (strcmp(m_Strings[i], str) == 0)
			return m_Strings[i];
	}
	
	return NULL;
}

void ConstantStringManager::AddConstantString (const char* string )
{
	SET_ALLOC_OWNER(gConstantStringManager);
	int length = strlen(string);
	char* newString = (char*)UNITY_MALLOC(kMemStaticString, length+1);
	memcpy(newString, string, length+1);
	m_Strings.push_back(newString);
}

void ConstantStringManager::AddConstantStrings (const char** strings, size_t size )
{
	m_Strings.resize_uninitialized(size + m_Strings.size());
	for (int i=0;i<size;++i)
		AddConstantString(strings[i]);
}

void ConstantStringManager::StaticInitialize ()
{
	gConstantStringManager = UNITY_NEW_AS_ROOT(ConstantStringManager, kMemString, "SharedStrings", "");
}

void ConstantStringManager::StaticCleanup ()
{
	// gConstantStringManager->DumpCommonStrings ();
	UNITY_DELETE(gConstantStringManager, kMemString);
	gConstantStringManager = NULL;
}
static RegisterRuntimeInitializeAndCleanup s_ConstantStringManagerCallbacks(ConstantStringManager::StaticInitialize, ConstantStringManager::StaticCleanup);

ConstantStringManager& GetConstantStringManager ()
{
	return *gConstantStringManager;
}