]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/base.h
Use size_t for sizes in I/O classes
[libs/core.git] / source / io / base.h
index 1fe143e10e18eed4668aac843c3d4905b54f3ede..7bd5bd9e963a4be383f2407a50fdf8a6f1c07d3e 100644 (file)
@@ -1,8 +1,10 @@
 #ifndef MSP_IO_BASE_H_
 #define MSP_IO_BASE_H_
 
+#include <cstddef>
 #include <sigc++/sigc++.h>
 #include <msp/core/mutex.h>
+#include <msp/core/noncopyable.h>
 #include "handle.h"
 #include "mode.h"
 #include "poll.h"
@@ -13,7 +15,7 @@ namespace IO {
 /**
 Common interface for all I/O objects.
 */
-class Base
+class Base: private NonCopyable
 {
 public:
        /** RAII synchronization primitive.  Prevents concurrent access to the
@@ -45,9 +47,6 @@ protected:
        Mutex *mutex;
 
        Base();
-private:
-       Base(const Base &);
-       Base &operator=(const Base &);
 public:
        virtual ~Base();
 
@@ -59,31 +58,37 @@ public:
        Blocking is enabled by default. */
        virtual void set_block(bool) = 0;
 
+       /** Sets inheritance mode.  When inheritance is enabled, the file descriptor
+       will persist through Process::execute.
+
+       Inheritance is disabled by default. */
+       virtual void set_inherit(bool) = 0;
+
        /** Returns the current mode flags. */
        Mode get_mode() const { return mode; }
 
 protected:
        void check_access(Mode) const;
 
-       virtual unsigned do_write(const char *, unsigned) = 0;
-       virtual unsigned do_read(char *, unsigned) = 0;
+       virtual std::size_t do_write(const char *, std::size_t) = 0;
+       virtual std::size_t do_read(char *, std::size_t) = 0;
 
 public:
        /** Writes data from a buffer.  Subject to blocking.  Returns the number of
        bytes written, which may be zero for a non-blockin operation. */
-       unsigned write(const char *b, unsigned c) { return do_write(b, c); }
+       std::size_t write(const char *b, std::size_t c) { return do_write(b, c); }
 
        /** Writes a string.  This is identical to calling
        write(s.data(), s.size()). */
-       unsigned write(const std::string &s) { return do_write(s.data(), s.size()); }
+       std::size_t write(const std::string &s) { return do_write(s.data(), s.size()); }
 
        /** Writes a single character.  This is identical to calling
        write(&c, 1). */
-       virtual unsigned put(char c) { return do_write(&c, 1); }
+       virtual std::size_t put(char c) { return do_write(&c, 1); }
 
        /** Reads data into a buffer.  Subject to blocking.  Returns the number of
        bytes read, which may be zero for a non-blocking operation. */
-       unsigned read(char *b, unsigned c) { return do_read(b, c); }
+       std::size_t read(char *b, std::size_t c) { return do_read(b, c); }
 
        /** Reads characters up to the next linefeed or end-of-file.  The linefeed
        is not included in the line.  Returns true if a line was successfully read,