mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.1 KiB
C++
88 lines
2.1 KiB
C++
#include "literals.hpp"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace Compiler
|
|
{
|
|
int Literals::getIntegerSize() const
|
|
{
|
|
return static_cast<int>(mIntegers.size() * sizeof(Interpreter::Type_Integer));
|
|
}
|
|
|
|
int Literals::getFloatSize() const
|
|
{
|
|
return static_cast<int>(mFloats.size() * sizeof(Interpreter::Type_Float));
|
|
}
|
|
|
|
int Literals::getStringSize() const
|
|
{
|
|
int size = 0;
|
|
|
|
for (std::vector<std::string>::const_iterator iter(mStrings.begin()); iter != mStrings.end(); ++iter)
|
|
size += static_cast<int>(iter->size()) + 1;
|
|
|
|
if (size % 4) // padding
|
|
size += 4 - size % 4;
|
|
|
|
return size;
|
|
}
|
|
|
|
void Literals::append(std::vector<Interpreter::Type_Code>& code) const
|
|
{
|
|
for (const int& mInteger : mIntegers)
|
|
code.push_back(*reinterpret_cast<const Interpreter::Type_Code*>(&mInteger));
|
|
|
|
for (const float& mFloat : mFloats)
|
|
code.push_back(*reinterpret_cast<const Interpreter::Type_Code*>(&mFloat));
|
|
|
|
int stringBlockSize = getStringSize();
|
|
int size = static_cast<int>(code.size());
|
|
|
|
code.resize(size + stringBlockSize / 4);
|
|
|
|
size_t offset = 0;
|
|
|
|
for (const auto& mString : mStrings)
|
|
{
|
|
size_t stringSize = mString.size() + 1;
|
|
|
|
std::copy(mString.c_str(), mString.c_str() + stringSize, reinterpret_cast<char*>(&code[size]) + offset);
|
|
offset += stringSize;
|
|
}
|
|
}
|
|
|
|
int Literals::addInteger(Interpreter::Type_Integer value)
|
|
{
|
|
int index = static_cast<int>(mIntegers.size());
|
|
|
|
mIntegers.push_back(value);
|
|
|
|
return index;
|
|
}
|
|
|
|
int Literals::addFloat(Interpreter::Type_Float value)
|
|
{
|
|
int index = static_cast<int>(mFloats.size());
|
|
|
|
mFloats.push_back(value);
|
|
|
|
return index;
|
|
}
|
|
|
|
int Literals::addString(const std::string& value)
|
|
{
|
|
int index = static_cast<int>(mStrings.size());
|
|
|
|
mStrings.push_back(value);
|
|
|
|
return index;
|
|
}
|
|
|
|
void Literals::clear()
|
|
{
|
|
mIntegers.clear();
|
|
mFloats.clear();
|
|
mStrings.clear();
|
|
}
|
|
}
|