#include <msp/core/maputils.h>
+#include <msp/fs/dir.h>
#include <msp/fs/stat.h>
+#include <msp/fs/utils.h>
#include <msp/io/file.h>
#include <msp/io/print.h>
#include <msp/strings/utils.h>
Cache::Cache(SourcePackage &p):
package(p),
- filename(package.get_temp_dir()/"../cache"),
+ filename(package.get_temp_directory()/"../cache"),
changed(false)
{ }
void Cache::set_value(const Target *tgt, const string &k, const string &v)
{
- ValueList vl;
+ Values vl;
vl.push_back(v);
set_values(tgt, k, vl);
}
void Cache::append_value(const Target *tgt, const string &k, const string &v)
{
Key key(tgt->get_name(), k);
- DataMap::iterator i = data.find(key);
+ auto i = data.find(key);
if(i==data.end())
- i = data.insert(DataMap::value_type(key, ValueList())).first;
+ i = data.insert({ key, Values() }).first;
i->second.push_back(v);
changed = true;
+ package.get_builder().get_logger().log("cache", format("Updated key %s %s+ %s", tgt->get_name(), k, v));
}
-void Cache::set_values(const Target *tgt, const string &k, const ValueList &v)
+void Cache::set_values(const Target *tgt, const string &k, const Values &v)
{
data[Key(tgt->get_name(), k)] = v;
changed = true;
+ package.get_builder().get_logger().log("cache", format("Updated key %s %s: %s", tgt->get_name(), k, join(v.begin(), v.end())));
}
const string &Cache::get_value(const Target *tgt, const string &k)
{
- const ValueList &values = get_values(tgt, k);
+ const Values &values = get_values(tgt, k);
if(values.empty())
throw logic_error("values.empty()");
return values.front();
}
-const Cache::ValueList &Cache::get_values(const Target *tgt, const string &k)
+const Cache::Values &Cache::get_values(const Target *tgt, const string &k)
{
return get_item(data, Key(tgt->get_name(), k));
}
key.second = read_string(in);
if(key.first.empty() || key.second.empty())
break;
- ValueList &values = data[key];
+ Values &values = data[key];
for(unsigned count = read_count(in); count; --count)
values.push_back(read_string(in));
+ package.get_builder().get_logger().log("cache", format("Loaded key %s %s: %s", key.first, key.second, join(values.begin(), values.end())));
}
mtime = st.get_modify_time();
if(data.empty() || !changed)
return;
+ FS::Path dir = FS::dirname(filename);
+ if(!FS::exists(dir))
+ FS::mkpath(dir, 0755);
package.get_builder().get_logger().log("files", format("Writing %s", filename));
IO::BufferedFile out(filename.str(), IO::M_WRITE);
- for(DataMap::const_iterator i=data.begin(); i!=data.end(); ++i)
+ for(const auto &kvp: data)
{
- write_string(out, i->first.first);
- write_string(out, i->first.second);
- write_count(out, i->second.size());
- for(ValueList::const_iterator j=i->second.begin(); j!=i->second.end(); ++j)
- write_string(out, *j);
+ write_string(out, kvp.first.first);
+ write_string(out, kvp.first.second);
+ write_count(out, kvp.second.size());
+ for(const string &v: kvp.second)
+ write_string(out, v);
}
+
+ changed = false;
}