Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
2.6 kB · 108 lines
C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109#include "locals.hpp"
#include <algorithm>#include <iterator>#include <ostream>#include <stdexcept>
#include <components/misc/strings/lower.hpp>
namespace Compiler{ const std::vector<std::string>& Locals::get(char type) const { switch (type) { case 's': return mShorts; case 'l': return mLongs; case 'f': return mFloats; }
throw std::logic_error("Unknown variable type"); }
int Locals::searchIndex(char type, std::string_view name) const { const std::vector<std::string>& collection = get(type);
auto iter = std::find(collection.begin(), collection.end(), name);
if (iter == collection.end()) return -1;
return static_cast<int>(iter - collection.begin()); }
bool Locals::search(char type, std::string_view name) const { return searchIndex(type, name) != -1; }
std::vector<std::string>& Locals::get(char type) { switch (type) { case 's': return mShorts; case 'l': return mLongs; case 'f': return mFloats; }
throw std::logic_error("Unknown variable type"); }
char Locals::getType(std::string_view name) const { if (search('s', name)) return 's';
if (search('l', name)) return 'l';
if (search('f', name)) return 'f';
return ' '; }
int Locals::getIndex(std::string_view name) const { int index = searchIndex('s', name);
if (index != -1) return index;
index = searchIndex('l', name);
if (index != -1) return index;
return searchIndex('f', name); }
void Locals::write(std::ostream& localFile) const { localFile << get('s').size() << ' ' << get('l').size() << ' ' << get('f').size() << std::endl;
std::copy(get('s').begin(), get('s').end(), std::ostream_iterator<std::string>(localFile, " ")); std::copy(get('l').begin(), get('l').end(), std::ostream_iterator<std::string>(localFile, " ")); std::copy(get('f').begin(), get('f').end(), std::ostream_iterator<std::string>(localFile, " ")); }
void Locals::declare(char type, std::string_view name) { get(type).push_back(Misc::StringUtils::lowerCase(name)); }
void Locals::clear() { get('s').clear(); get('l').clear(); get('f').clear(); }}