C++-Programmierung/ Eine Matrix-Bibliothek – mitrax/ iomanip.hpp

Aus Wikibooks
Zur Navigation springen Zur Suche springen
Nuvola-inspired-terminal.svg
  1 #ifndef _mitrax_mitrax_iomanip_hpp_INCLUDED_
  2 #define _mitrax_mitrax_iomanip_hpp_INCLUDED_
  3 /// \file iomanip.hpp
  4 ///
  5 /// \brief Ausgabemanipulatoren
  6 ///
  7 /// In dieser Datei werden derzeit die beiden Ausgabemanipulatoren für die minimale Elementbreite
  8 /// und den Mehrzeilenmodus implementiert.
  9 
 10 namespace mitrax{
 11 
 12 namespace detail{
 13 
 14 /// \brief Eindeutige Speicherposition für Mindestausgabebreite
 15 long& element_width_flag(std::ios_base& s){
 16     static int const unique_index = std::ios_base::xalloc();
 17     return s.iword(unique_index);
 18 }
 19 
 20 /// \brief Positionen verschiedener <code>bool</code>-Ausgabeflags innerhalb der entsprechenden
 21 ///        Speicherposition
 22 struct format_flags{
 23     /// \brief Gesetzt für mehrzeilige Ausgabe
 24     static long const multi_line = 0x01;
 25 };
 26 
 27 /// \brief Eindeutige Speicherposition für <code>bool</code>-Flags
 28 ///
 29 /// Erzeugt eine neue, eindeutige Speicherposition innerhalb eines Streams <code>s</code>,
 30 /// in der mehrere <code>bool</code>-Werte Platz finden können.
 31 ///
 32 /// siehe format_flags
 33 long& format_flags_flag(std::ios_base& s){
 34     static int const unique_index = std::ios_base::xalloc();
 35     return s.iword(unique_index);
 36 }
 37 
 38 
 39 }
 40 
 41 /// \brief Lesezugriff auf die Mindestausgabebreite eines Elements
 42 long get_element_width_flag(std::ios_base& s){
 43     return detail::element_width_flag(s);
 44 }
 45 
 46 /// \brief Schreibzugriff auf die Mindestausgabebreite eines Elements
 47 void set_element_width_flag(std::ios_base& s, long n){
 48     detail::element_width_flag(s) = n;
 49 }
 50 
 51 
 52 /// \brief Lesezugriff auf das Flag für mehrzeilige Ausgabe
 53 bool get_multi_line_flag(std::ios_base& s){
 54     return detail::format_flags_flag(s) & detail::format_flags::multi_line;
 55 }
 56 
 57 /// \brief Schreibzugriff auf das Flag für mehrzeilige Ausgabe
 58 void set_multi_line_flag(std::ios_base& s, bool f){
 59     if(f){
 60         detail::format_flags_flag(s) |= detail::format_flags::multi_line;
 61     }else{
 62         detail::format_flags_flag(s) &= ~static_cast< long >(detail::format_flags::multi_line);
 63     }
 64 }
 65 
 66 
 67 
 68 /// \brief Klasse für ein Objekt, das für einen Ausgabestream die Mindestausgabebreite setzt
 69 ///
 70 /// Verwendung:
 71 ///   - <code>os << set_element_width(Ganzzahl);</code>
 72 class set_element_width{
 73 /// \brief Setzten der Mindestausgabebreite <code>f</code> eines Elements für einen beliebigen
 74 ///        Ausgabestream <code>os</code>
 75 template < class charT, class traits >
 76 friend std::basic_ostream< charT, traits >&
 77 operator<<(std::basic_ostream< charT, traits >& os, set_element_width const& f){
 78     set_element_width_flag(os, f.width_);
 79     return os;
 80 }
 81 public:
 82     /// \brief Erzeugt ein Objekt, dass die gewünschte Mindestausgabebreite enthält
 83     set_element_width(long width):width_(width){}
 84 private:
 85     /// \brief Die Mindestausgabebreite
 86     long const width_;
 87 };
 88 
 89 /// \brief Klasse für ein Objekt, das für einen Ausgabestream das <code>multi_line</code>-Flag
 90 ///        setzt
 91 ///
 92 /// Verwendung:
 93 ///   - <code>os << set_multi_line(bool);</code>
 94 class set_multi_line{
 95 /// \brief Setzten des multi_line-Flags f für einen beliebigen Ausgabestream os
 96 template < class charT, class traits >
 97 friend std::basic_ostream< charT, traits >&
 98 operator<<(std::basic_ostream< charT, traits >& os, set_multi_line const& f){
 99     set_multi_line_flag(os, f.on_);
100     return os;
101 }
102 public:
103     /// \brief Erzeugt ein Objekt, welches den Zustand des <code>multi_line</code>-Flags enthält
104     set_multi_line(bool on):on_(on){}
105 private:
106     /// \brief Das <code>multi_line</code>-Flag
107     bool const on_;
108 };
109 
110 /// \brief Mehrzeilige Ausgabe aktivieren
111 ///
112 /// Verwendung:
113 ///   - <code>os << multi_line;</code>
114 set_multi_line multi_line = true;
115 /// \brief Mehrzeilige Ausgabe deaktivieren
116 ///
117 /// Verwendung:
118 ///   - <code>os << single_line;</code>
119 set_multi_line single_line = false;
120 
121 }
122 
123 #endif