Add activation check to the rest of Filtered's virtual functions
authorMikko Rasa <tdb@tdb.fi>
Sat, 20 Apr 2013 14:19:55 +0000 (17:19 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 20 Apr 2013 14:19:55 +0000 (17:19 +0300)
This fixes a bug manifesting in builder where a put call that triggers a
BufferedFile's buffer flush causes the buffer contents to be written to
the file twice.

source/io/filtered.h

index 0d323ecea69667e57c9c148a163837d7a2237149..a4a43192b4b2c166dbf4952e3dfff4ee9aad270e 100644 (file)
@@ -4,6 +4,7 @@
 namespace Msp {
 namespace IO {
 
+// XXX This needs a redesign
 template<typename B, typename F>
 class Filtered: public B
 {
@@ -53,9 +54,32 @@ protected:
        }
 
 public:
-       virtual unsigned put(char c) { return filter.put(c); }
-       virtual bool getline(std::string &l) { return filter.getline(l); }
-       virtual int get() { return filter.get(); }
+       virtual unsigned put(char c)
+       {
+               if(active)
+                       return B::put(c);
+
+               Activator a(*this);
+               return filter.put(c);
+       }
+
+       virtual bool getline(std::string &l)
+       {
+               if(active)
+                       return B::getline(l);
+
+               Activator a(*this);
+               return filter.getline(l);
+       }
+
+       virtual int get()
+       {
+               if(active)
+                       return B::get();
+                       
+               Activator a(*this);
+               return filter.get();
+       }
 
        F &get_filter() { return filter; }
 };