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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2000 National Library of Medicine
All rights reserved.
See COPYRIGHT.txt for copyright details.
=========================================================================*/
#include "cmCacheManager.h"
#include "cmSystemTools.h"
const char* cmCacheManagerTypes[] =
{ "BOOL",
"PATH",
"STRING",
0
};
cmCacheManager::CacheEntryType cmCacheManager::StringToType(const char* s)
{
int i = 0;
while(cmCacheManagerTypes[i])
{
if(strcmp(s, cmCacheManagerTypes[i]) == 0)
{
return static_cast<CacheEntryType>(i);
}
}
return STRING;
}
cmCacheManager* cmCacheManager::s_Instance = 0;
cmCacheManager* cmCacheManager::GetInstance()
{
if(!cmCacheManager::s_Instance)
{
cmCacheManager::s_Instance = new cmCacheManager;
}
return cmCacheManager::s_Instance;
}
bool cmCacheManager::LoadCache(const char* path)
{
std::ifstream fin(path);
if(!fin)
{
cmSystemTools::Error("Unable to open cache file for load. ", path);
return false;
}
const int bsize = 4096;
char buffer[bsize];
std::string inputLine;
while(fin)
{
CacheEntry e;
std::string key;
fin.getline(buffer, bsize, '|');
key = buffer;
fin.getline(buffer, bsize, '|');
e.m_Value = buffer;
fin.getline(buffer, bsize); // last token is separated by a newline
e.m_Type = cmCacheManager::StringToType(buffer);
if(fin)
{
m_Cache[key] = e;
}
}
}
bool cmCacheManager::SaveCache(const char* path)
{
std::ofstream fout(path);
if(!fout)
{
cmSystemTools::Error("Unable to open cache file for save. ", path);
return false;
}
for( std::map<std::string, CacheEntry>::iterator i = m_Cache.begin();
i != m_Cache.end(); ++i)
{
fout << (*i).first.c_str() << " | " << (*i).second.m_Value << " | ";
CacheEntryType t = (*i).second.m_Type;
fout << cmCacheManagerTypes[t];
}
fout << "\n";
}
void cmCacheManager::AddCacheEntry(const char* key,
const char* value,
CacheEntryType type)
{
CacheEntry e;
e.m_Value = value;
e.m_Type = type;
m_Cache[key] = e;
}
const char* cmCacheManager::GetCacheValue(const char* key)
{
if(m_Cache.count(key))
{
return m_Cache[key].m_Value.c_str();
}
return 0;
}
|