std::wstring xl::colNameW(
size_t aIndex)
{
wchar_t q[21]; // more than enough even for 64-bit system :)
wchar_t* ptr = q + 20;
*ptr = 0; // debug
// Getting size
size_t n = 1;
unsigned long long pw = 26;
while (aIndex>=pw && n<20)
{
aIndex -= static_cast<size_t>(pw);
pw *= 26;
++n;
}
FOR_S(i, 0, n) // макрос, означающий for (size_t i = 0; i < n; ++i)
{
*(--ptr) = static_cast<wchar_t>(L'A' + (aIndex % 26));
aIndex /= 26;
}
return std::wstring(ptr, n);
}
namespace {
bool isCap(const char* x, const char* aEnd)
{
return (x != aEnd && *x >= 'A' && *x <= 'Z');
}
bool isDig(const char* x, const char* aEnd)
{
return (x != aEnd && *x >= '0' && *x <= '9');
}
} // anon namespace
xl::CellCoords xl::parseCellCoords(
const char* aStart, const char* aEnd)
{
enum {
AA = 26,
AAA = 26 + 26 * 26
};
xl::CellCoords r;
// Letter
r.col = 0;
if (!isCap(aStart, aEnd))
return CellCoords::bad();
r.col = *(aStart++) - 'A';
if (isCap(aStart, aEnd)) {
r.col = (r.col * 26) + *(aStart++) - 'A';
if (isCap(aStart, aEnd)) {
r.col = AAA + (r.col * 26) + *(aStart++) - 'A';
} else {
r.col += AA;
}
}
// Number
r.row = 0;
while (isDig(aStart, aEnd)) {
size_t r0 = r.row;
r.row = r.row * 10 + *(aStart++) - '0';
if (r.row < r0)
return CellCoords::bad();
}
if (r.row == 0 || aStart != aEnd)
return CellCoords::bad();
--r.row;
return r;
}
int N, K;
Mission missions[100];
int bestTime = std::numeric_limits<int>::max();
bool recurse(int firstMission, int currPoints, int currTime)
{
if (currTime >= bestTime)
return false;
if (currPoints >= K) {
bestTime = currTime;
return false;
}
if (firstMission >= N)
return true;
int remPoints = K - currPoints;
for (int i = firstMission; i <= N; ++i) {
bool isFirst = (i == firstMission);
const Mission& im = missions[i];
if (currPoints + im.tailPoints < K) // tailPoints = сумма очков по хвосту от missions[i] до конца
return isFirst;
float wantedTime = currTime + remPoints * im.ratio; // ratio = (float)m.time / m.points;
if (wantedTime >= bestTime)
return isFirst;
if (recurse(i + 1, currPoints + im.points, currTime + im.time))
return isFirst;
}
return false;
}
var = null;
Если нужно ещё и мусорщика пустить — ну пусти, System.gc();
doSomething(String data, int start, int length)
, не вытягивая подстроку физически. Использовать StringBuilder. class Stream {
public:
virtual void write(size_t length, const void* data) = 0;
// пишет в поток word в машинном порядке байтов
void writeW(uint16_t data) {
write(2, &data);
}
};
class ErpConnector {
public:
// 80% модулей не могут экспортировать данные в систему управления
// предприятием — напишем базовую реализацию.
virtual bool canExportData() const { return false; }
virtual void exportData() const {}
};
void im::DateGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
{
aDate = toDate(toInt(aDate, aStart), aStart);
}
void im::MonthGrouper::toFirstDateOfPeriod(dt::Date& aDate, int aStart) const
{
if (aDate.day < aStart)
aDate.addMonthsMechanical(-1); // механически вычесть 1 месяц; дата может стать неверной.
aDate.day = aStart;
aDate.fixupTo1(); // неверную дату привести к 1-му числу следующего месяца
}
byte[] streamedResponse = new byte[100];
for (int iWord = 0, iByte = 4;
iWord < 50;
++iWord, iByte += 2) {
int w = MassCurrentsPhases[iWord];
streamedResponse[iByte] = (byte)w;
streamedResponse[iByte + 1] = (byte)(w >> 8);
}