Здравствуйте, bookevg, Вы писали:
B>Здравствуйте, Максим2006, Вы писали:
М>>Здравствуйте, bookevg, Вы писали:
М>>Можно завести вспомогательные классы, правда тогда регистровое представление функцией нужно сделать (у меня так получилось, но возможны варианты).
B>Вроде все получается, но вот только расход памяти большой: для 16=тиразрядного числа: 16 * 4байта * 4указателя(при 32-хразрядных указателях) + 2байта (само число) = 258 — для моего арм-процессора это много. Таких регистров м.б. 250 штук.
Это ведь непрямой путь к цели. Тут неизбежны накладные расходы. Прямой путь — это ввод методов по установке флагов. Кое-что можно перенести на рантайм, но это уже хаки по-любому.
struct StatusData
{
private:
void SetStatus(unsigned status) { m_DataUnion.dataBit.nStatus = status; }
unsigned GetStatus() { return m_DataUnion.dataBit.nStatus; }
void SetReady(unsigned ready) { m_DataUnion.dataBit.nReady = ready; };
unsigned GetReady() { return m_DataUnion.dataBit.nReady; };
void SetReg(unsigned reg) { m_DataUnion.data = reg; };
unsigned GetReg() { return m_DataUnion.data; };
private:
struct StatusField
{
void operator=(unsigned ready) { pThis()->SetStatus(ready); }
operator unsigned() { return pThis()->GetStatus(); }
private:
StatusData* pThis() {
StatusField StatusData::* pmem = &StatusData::Status;
return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
}
};
struct ReadyField
{
void operator=(unsigned ready) { pThis()->SetReady(ready); }
operator unsigned() { return pThis()->GetReady(); }
private:
StatusData* pThis() {
ReadyField StatusData::* pmem = &StatusData::Ready;
return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
}
};
struct RegField
{
void operator=(unsigned reg) { pThis()->SetReg(reg); }
operator unsigned() { return pThis()->GetReg(); }
private:
StatusData* pThis() {
RegField StatusData::* pmem = &StatusData::Reg;
return (StatusData*)((__int64)(this) - *(__int64*)&pmem);
}
};
public:
StatusField Status;
ReadyField Ready;
RegField Reg;
private:
struct Data {
unsigned nStatus : 1;
unsigned nReady : 1;
};
union DataUnion {
Data dataBit;
unsigned data;
};
DataUnion m_DataUnion;
};