<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>C++ write your own stream class - part 1: output stream initial design (embedded friendly C++)</title><link>/technologies/code_exchange/b/blog/posts/c-write-your-own-stream-class---part-1-output-stream-initial-design-embedded-friendly-c</link><description>In C++ it&amp;#39;s common to stream data. You write to a file using the &amp;lt;&amp;lt; operator.
example: 
cout &amp;lt;&amp;lt; &amp;quot;hello, world! &amp;lt;&amp;lt; endl;
In this blog I&amp;#39;m making my own minimal output stream class. Just enough code to show that it works. This co...</description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>RE: C++ write your own stream class - part 1: output stream initial design (embedded friendly C++)</title><link>https://community.element14.com/technologies/code_exchange/b/blog/posts/c-write-your-own-stream-class---part-1-output-stream-initial-design-embedded-friendly-c</link><pubDate>Sat, 15 Nov 2025 15:00:58 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8c59a5c6-a3c4-4c0f-93f7-663176067def</guid><dc:creator>Jan Cumps</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;a real world example. Implementation for a Raspberry Pico. Using its UART api:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="268" src="/resized-image/__size/992x536/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-8c59a5c6-a3c4-4c0f-93f7-663176067def/pastedimage1763218777901v1.png" width="496" /&gt;&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:a562dd8b-d276-4ce2-9069-2f6f482f7585:type=csharp&amp;text=class%20uartostream%20%7B%0Apublic%3A%0A%20%20%20%20uartostream%28%29%20%7B%7D%0A%0A%20%20%20%20uartostream%26%20operator%20%3C%3C%20%28const%20char%2A%20msg%29%20%7B%0A%20%20%20%20%20%20%20%20uart_puts%28UART_ID%2C%20msg%29%3B%0A%20%20%20%20%20%20%20%20return%20%2Athis%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20uartostream%26%20operator%20%3C%3C%20%28const%20std%3A%3Astring%26%20msg%29%20%7B%0A%20%20%20%20%20%20%20%20uart_puts%28UART_ID%2C%20msg.c_str%28%29%29%3B%0A%20%20%20%20%20%20%20%20return%20%2Athis%3B%0A%20%20%20%20%7D%0A%7D%3B]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29344&amp;AppID=74&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: C++ write your own stream class - part 1: output stream initial design (embedded friendly C++)</title><link>https://community.element14.com/technologies/code_exchange/b/blog/posts/c-write-your-own-stream-class---part-1-output-stream-initial-design-embedded-friendly-c</link><pubDate>Wed, 12 Nov 2025 17:14:31 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8c59a5c6-a3c4-4c0f-93f7-663176067def</guid><dc:creator>Jan Cumps</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Is this expensive? The facts&lt;/p&gt;
&lt;p&gt;When I use a subclass uartiostream and its &amp;lt;&amp;lt; operator:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="287" src="/resized-image/__size/1002x574/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-8c59a5c6-a3c4-4c0f-93f7-663176067def/pastedimage1762967342953v2.png" width="501" /&gt;&lt;/p&gt;
&lt;p&gt;This compiles to&lt;/p&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;mov&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;r3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#53&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;mov&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;r0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#8&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;strb&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;r3&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#7&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#8&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;bx&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;lr&lt;/span&gt;&lt;br /&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;.space&lt;/span&gt;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;when I use plain C to do the same:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " height="97" src="/resized-image/__size/994x194/__key/commentfiles/f7d226abd59f475c9d224a79e3f0ec07-8c59a5c6-a3c4-4c0f-93f7-663176067def/pastedimage1762967477247v3.png" width="497" /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;mov&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;r3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#53&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;mov&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;r0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#0&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#8&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;strb&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;r3&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#7&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;#8&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span&gt;bx&lt;/span&gt;&lt;span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;lr&lt;/span&gt;&lt;/pre&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;The only difference is a single address location (32 bits) to hold the object u&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;0&amp;nbsp;cpu cycles&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;That&amp;#39;s virtually cost-free&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29344&amp;AppID=74&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: C++ write your own stream class - part 1: output stream initial design (embedded friendly C++)</title><link>https://community.element14.com/technologies/code_exchange/b/blog/posts/c-write-your-own-stream-class---part-1-output-stream-initial-design-embedded-friendly-c</link><pubDate>Tue, 11 Nov 2025 20:37:34 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8c59a5c6-a3c4-4c0f-93f7-663176067def</guid><dc:creator>DAB</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Nice post Jan.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29344&amp;AppID=74&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: C++ write your own stream class - part 1: output stream initial design (embedded friendly C++)</title><link>https://community.element14.com/technologies/code_exchange/b/blog/posts/c-write-your-own-stream-class---part-1-output-stream-initial-design-embedded-friendly-c</link><pubDate>Tue, 11 Nov 2025 20:26:39 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:8c59a5c6-a3c4-4c0f-93f7-663176067def</guid><dc:creator>Jan Cumps</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Defining an input streamer has the same complexity as the output streamer.&lt;/p&gt;
&lt;p&gt;Once&amp;nbsp;the in- and out-streamers are written, writing a bidirectional one isn&amp;#39;t that difficult:&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:cc081195-6eb2-4329-af2e-fb1d07d62d54:type=csharp&amp;text=class%20uartistream%20%7B%0D%0Apublic%3A%0D%0A%20%20uartistream%28%29%20%7B%7D%0D%0A%20%20%0D%0A%20%20uartistream%26%20operator%20%3E%3E%20%28std%3A%3Astring%26%20msg%29%20%7B%0D%0A%20%20%20%20%2F%2F%20read%20from%20UART%0D%0A%20%20%20%20return%20%2Athis%3B%0D%0A%20%20%7D%20%20%0D%0A%20%20uartistream%26%20operator%20%3E%3E%20%28char%2A%20msg%29%20%7B%0D%0A%20%20%20%20%20%20%2F%2F%20read%20from%20UART%0D%0A%20%20%20%20return%20%2Athis%3B%0D%0A%20%20%7D%0D%0A%7D%3B%0D%0A%0D%0Aclass%20uartiostream%3A%20public%20uartistream%2C%20public%20uartostream%20%7B%0D%0A%7D%3B]&lt;/p&gt;
&lt;p&gt;Inheriting form both base classes doesn&amp;#39;t cost anything - because I didn&amp;#39;t define any virtual functions.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The difficult work will be at the lower level: write the implementation of the &amp;lt;&amp;lt; and &amp;gt;&amp;gt; operators using device dependent UART&amp;nbsp;APIs.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=29344&amp;AppID=74&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item></channel></rss>