Skip to content

Commit

Permalink
Replace fdstream implementation with a stock one wnd work out that GC…
Browse files Browse the repository at this point in the history
…SAs can't be serialized empty
  • Loading branch information
adamnovak committed Jan 28, 2019
1 parent cbd7f08 commit fa36dec
Show file tree
Hide file tree
Showing 9 changed files with 250 additions and 190 deletions.
10 changes: 9 additions & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Catch.hpp is licensed under the Boost Software License.
src/unittest/catch.hpp is licensed under the Boost Software License.

Boost Software License - Version 1.0 - August 17th, 2003

Expand All @@ -47,3 +47,11 @@ SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

src/stream/fdstream.hpp is licensed under the following license:

(C) Copyright Nicolai M. Josuttis 2001.
Permission to copy, use, modify, sell and distribute this software
is granted provided this copyright notice appears in all copies.
This software is provided "as is" without express or implied
warranty, and with no claim as to its suitability for any purpose.
53 changes: 0 additions & 53 deletions src/stream/fd_streams.cpp

This file was deleted.

112 changes: 0 additions & 112 deletions src/stream/fd_streams.hpp

This file was deleted.

188 changes: 188 additions & 0 deletions src/stream/fdstream.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
/* The following code declares classes to read from and write to
* file descriptore or file handles.
*
* See
* http://www.josuttis.com/cppcode
* for details and the latest version.
*
* - open:
* - integrating BUFSIZ on some systems?
* - optimized reading of multiple characters
* - stream for reading AND writing
* - i18n
*
* (C) Copyright Nicolai M. Josuttis 2001.
* Permission to copy, use, modify, sell and distribute this software
* is granted provided this copyright notice appears in all copies.
* This software is provided "as is" without express or implied
* warranty, and with no claim as to its suitability for any purpose.
*
* Version: Jul 28, 2002
* History:
* Jan 29, 2019: namespace for vg project
* Jul 28, 2002: bugfix memcpy() => memmove()
* fdinbuf::underflow(): cast for return statements
* Aug 05, 2001: first public version
*/
#ifndef VG_STREAM_FDSTREAM_HPP_INCLUDED
#define VG_STREAM_FDSTREAM_HPP_INCLUDED

#include <istream>
#include <ostream>
#include <streambuf>
// for EOF:
#include <cstdio>
// for memmove():
#include <cstring>


// low-level read and write functions
#ifdef _MSC_VER
# include <io.h>
#else
# include <unistd.h>
//extern "C" {
// int write (int fd, const char* buf, int num);
// int read (int fd, char* buf, int num);
//}
#endif


namespace vg {

namespace stream {


/************************************************************
* fdostream
* - a stream that writes on a file descriptor
************************************************************/


class fdoutbuf : public std::streambuf {
protected:
int fd; // file descriptor
public:
// constructor
fdoutbuf (int _fd) : fd(_fd) {
}
protected:
// write one character
virtual int_type overflow (int_type c) {
if (c != EOF) {
char z = c;
if (write (fd, &z, 1) != 1) {
return EOF;
}
}
return c;
}
// write multiple characters
virtual
std::streamsize xsputn (const char* s,
std::streamsize num) {
return write(fd,s,num);
}
};

class fdostream : public std::ostream {
protected:
fdoutbuf buf;
public:
fdostream (int fd) : std::ostream(0), buf(fd) {
rdbuf(&buf);
}
};


/************************************************************
* fdistream
* - a stream that reads on a file descriptor
************************************************************/

class fdinbuf : public std::streambuf {
protected:
int fd; // file descriptor
protected:
/* data buffer:
* - at most, pbSize characters in putback area plus
* - at most, bufSize characters in ordinary read buffer
*/
static const int pbSize = 4; // size of putback area
static const int bufSize = 1024; // size of the data buffer
char buffer[bufSize+pbSize]; // data buffer

public:
/* constructor
* - initialize file descriptor
* - initialize empty data buffer
* - no putback area
* => force underflow()
*/
fdinbuf (int _fd) : fd(_fd) {
setg (buffer+pbSize, // beginning of putback area
buffer+pbSize, // read position
buffer+pbSize); // end position
}

protected:
// insert new characters into the buffer
virtual int_type underflow () {
#ifndef _MSC_VER
using std::memmove;
#endif

// is read position before end of buffer?
if (gptr() < egptr()) {
return traits_type::to_int_type(*gptr());
}

/* process size of putback area
* - use number of characters read
* - but at most size of putback area
*/
int numPutback;
numPutback = gptr() - eback();
if (numPutback > pbSize) {
numPutback = pbSize;
}

/* copy up to pbSize characters previously read into
* the putback area
*/
memmove (buffer+(pbSize-numPutback), gptr()-numPutback,
numPutback);

// read at most bufSize new characters
int num;
num = read (fd, buffer+pbSize, bufSize);
if (num <= 0) {
// ERROR or EOF
return EOF;
}

// reset buffer pointers
setg (buffer+(pbSize-numPutback), // beginning of putback area
buffer+pbSize, // read position
buffer+pbSize+num); // end of buffer

// return next character
return traits_type::to_int_type(*gptr());
}
};

class fdistream : public std::istream {
protected:
fdinbuf buf;
public:
fdistream (int fd) : std::istream(0), buf(fd) {
rdbuf(&buf);
}
};


}

}

#endif
3 changes: 2 additions & 1 deletion src/stream/register_loader_saver_gcsa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ void register_loader_saver_gcsa() {
return (void*) index;
}), wrap_stream_saver([](const void* index_void, ostream& output) {
// Cast to GCSA and serialize to the stream.
sdsl::serialize(*(const gcsa::GCSA*) index_void, output);
assert(index_void != nullptr);
((const gcsa::GCSA*) index_void)->serialize(output);
}));
}

Expand Down
2 changes: 1 addition & 1 deletion src/stream/register_loader_saver_lcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void register_loader_saver_lcp() {
return (void*) index;
}), wrap_stream_saver([](const void* index_void, ostream& output) {
// Cast to LCP and serialize to the stream.
sdsl::serialize(*(const gcsa::LCPArray*) index_void, output);
((const gcsa::LCPArray*) index_void)->serialize(output);
}));

}
Expand Down
Loading

0 comments on commit fa36dec

Please sign in to comment.