]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/filtered.h
Rewrite BufferedFile as a standalone class
[libs/core.git] / source / io / filtered.h
index 0d323ecea69667e57c9c148a163837d7a2237149..209274361e4432ca6608d4eb1112786c5b84e100 100644 (file)
@@ -4,6 +4,11 @@
 namespace Msp {
 namespace IO {
 
+/**
+This class is broken by design.  Do not use.  It exposes base class methods in
+an unsafe and misleading way.  In particular, a Filtered<File, Buffered> causes
+seeks to behave incorrectly.
+*/
 template<typename B, typename F>
 class Filtered: public B
 {
@@ -53,9 +58,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; }
 };