-
Notifications
You must be signed in to change notification settings - Fork 82
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Update ostream #69
base: master
Are you sure you want to change the base?
Update ostream #69
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -27,6 +27,11 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#include "cstdio" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#include "ostream_helpers" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#ifdef ARDUINO_ARCH_AVR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#include <avr/pgmspace.h> // typedef PGM_P, pgm_read_byte() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#include "WString.h" // class __FlashStringHelper | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Probably better to just |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#pragma GCC visibility push(default) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
namespace std { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -407,6 +412,24 @@ namespace std { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return out; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#ifdef ARDUINO_ARCH_AVR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//support strings from flash memory [PI] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//stolen from Arduino Print.cpp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//sample use: cout << F("Hello") << endl; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template<class charT, class traits> _UCXXEXPORT basic_ostream<charT,traits>& | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operator<<(basic_ostream<charT,traits>& out, const __FlashStringHelper* c) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
typename basic_ostream<charT,traits>::sentry s(out); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PGM_P p = reinterpret_cast<PGM_P>(c); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
while (true) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
charT x = pgm_read_byte(p++); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (x == 0) break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
out.put(x); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return out; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// partial specializations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template<class traits> _UCXXEXPORT basic_ostream<char,traits>& | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operator<<(basic_ostream<char,traits>& out, const char* c) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -416,6 +439,24 @@ namespace std { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return out; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#ifdef ARDUINO_ARCH_AVR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//support strings from flash memory [PI] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//stolen from Arduino Print.cpp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//sample use: cout << F("Hello") << endl; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template<class traits> _UCXXEXPORT basic_ostream<char,traits>& | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operator<<(basic_ostream<char,traits>& out, const __FlashStringHelper* c) //[PI: New] stolen from Arduino Print.cpp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this specialization really needed? It looks like the implementation is identical to the generate There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm.... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I mean that the implementation of this specialization: Lines 442 to 458 in f426344
Is identical to this specialization: Lines 415 to 431 in f426344
So I think the first one is redundant and should be caught by the second one (with There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. May be Mike just copied some of my code... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
typename basic_ostream<char,traits>::sentry s(out); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PGM_P p = reinterpret_cast<PGM_P>(c); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
while (true) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
char x = pgm_read_byte(p++); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (x == 0) break; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
out.put(x); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return out; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#endif | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#ifdef __UCLIBCXX_HAS_WCHAR__ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template<class traits> _UCXXEXPORT basic_ostream<wchar_t,traits>& | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operator<<(basic_ostream<wchar_t,traits>& out, const char* c) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would consider leaving out these include guards, since pretty much every (non-AVR) Arduino core provides dummy version of the
F()
macro andpgm_read_byte
and friends, so adding this code unconditionally makes user code that usesF()
and ArduinoSTL more portable.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, but this code will not run on other than AVR. avr/pgmspace.h is required to read from flash.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Most cores actually provide a dummy
avr/pgmspace.h
, so portable sketches can still useF()
(etc.) and compile on non-AVR too. E.g. see https://github.com/arduino/ArduinoCore-sam/tree/master/cores/arduino/avr and https://github.com/stm32duino/Arduino_Core_STM32/tree/main/cores/arduino/avr (better to just includeArduino.h
instead, though, since that should also include pgmspace or its dummy).There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand. Code for SAM and STM should compile without complaning about missing F() macro