#include #include #include #include "stdio.h" template struct PgmTypeTrait {}; template<> struct PgmTypeTrait { static char read(uint16_t addr_short) {return pgm_read_byte_near(addr_short);} }; template<> struct PgmTypeTrait { static int read(uint16_t addr_short) {return pgm_read_word_near(addr_short);} }; template class ProgmemConstIterator { public: constexpr ProgmemConstIterator(const T* ptr) : ptr_(ptr) {} constexpr auto operator != (const ProgmemConstIterator& rhs) { return ptr_ != rhs.ptr_;} constexpr auto operator ++ () { return ProgmemConstIterator(ptr_++);} T operator * () const { return PgmTypeTrait::read((uint16_t)ptr_);} private: const T* ptr_; }; template class ProgmemArray : protected ::std::array { public: using const_iterator = ProgmemConstIterator; constexpr ProgmemArray(const ::std::array &init) : ::std::array(init) {} constexpr ProgmemArray(const T (&init)[N]) : ::std::array(::std::to_array(init)) {} auto begin() const noexcept {return const_iterator(::std::array::begin()); } auto end() const noexcept {return const_iterator(::std::array::end()); } }; const ProgmemArray my_str PROGMEM = "Hello World"; void intTest1() { for (const auto c : my_str) putc(c, stdout); }