#pragma XOD dirtiness disable
class FlashStringView : public ListView<char> {
public:
class Cursor : public detail::Cursor<char> {
public:
Cursor(const char PROGMEM* str) : _ptr(str) {}
bool isValid() const override {
return static_cast<bool>(static_cast<char>(pgm_read_byte(_ptr)));
}
bool value(char* out) const override {
*out = static_cast<char>(pgm_read_byte(_ptr));
return static_cast<bool>(*out);
}
void next() override { ++_ptr; }
private:
const char PROGMEM* _ptr;
};
public:
FlashStringView(const char PROGMEM* str = nullptr) : _str(str) {}
FlashStringView(const __FlashStringHelper* str)
: _str(reinterpret_cast<const char PROGMEM*>(str)) {}
FlashStringView& operator=(const FlashStringView& rhs) {
_str = rhs._str;
return *this;
}
virtual Iterator<char> iterate() const override {
return _str ? Iterator<char>(new Cursor(_str)) : Iterator<char>::nil();
}
private:
friend class Cursor;
const char PROGMEM* _str;
};
class XStringFlashString : public XString {
public:
XStringFlashString(const char PROGMEM* str) : XString(&_view), _view(str) {}
XStringFlashString(const __FlashStringHelper* str)
: XString(&_view), _view(str) {}
private:
FlashStringView _view;
};
struct State {
};
{{ GENERATED_CODE }}
const char text[] PROGMEM = {"Branch Menu 2"};
static XStringFlashString out_text = XStringFlashString(text);
void evaluate(Context ctx) {
if (isSettingUp()) {
emitValue<output_TXT>(ctx, out_text);
}
}