You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
64 lines
1.7 KiB
// This file is part of libigl, a simple c++ geometry processing library.
|
|
//
|
|
// Copyright (C) 2020 Jérémie Dumas <jeremie.dumas@ens-lyon.org>
|
|
// Copyright (C) 2021 Alec Jacobson <alecjacobson@gmail.com>
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public License
|
|
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
|
// obtain one at http://mozilla.org/MPL/2.0/.
|
|
#ifndef IGL_FILEMEMORYSTREAM_H
|
|
#define IGL_FILEMEMORYSTREAM_H
|
|
|
|
#include "igl_inline.h"
|
|
|
|
#include <streambuf>
|
|
#include <istream>
|
|
#include <string>
|
|
|
|
namespace igl {
|
|
struct FileMemoryBuffer : public std::streambuf
|
|
{
|
|
char *p_start{nullptr};
|
|
char *p_end{nullptr};
|
|
size_t size;
|
|
|
|
FileMemoryBuffer(char const *first_elem, size_t size)
|
|
: p_start(const_cast<char *>(first_elem)), p_end(p_start + size),
|
|
size(size)
|
|
{
|
|
setg(p_start, p_start, p_end);
|
|
}
|
|
|
|
pos_type seekoff(
|
|
off_type off,
|
|
std::ios_base::seekdir dir,
|
|
std::ios_base::openmode /*which*/) override
|
|
{
|
|
if (dir == std::ios_base::cur)
|
|
{
|
|
gbump(static_cast<int>(off));
|
|
}else
|
|
{
|
|
setg(p_start,(dir==std::ios_base::beg ? p_start : p_end) + off,p_end);
|
|
}
|
|
return gptr() - p_start;
|
|
}
|
|
|
|
pos_type seekpos(pos_type pos, std::ios_base::openmode which) override
|
|
{
|
|
return seekoff(pos, std::ios_base::beg, which);
|
|
}
|
|
};
|
|
|
|
/// Class to convert a FILE * to an std::istream
|
|
struct FileMemoryStream : virtual FileMemoryBuffer, public std::istream
|
|
{
|
|
FileMemoryStream( char const *first_elem, size_t size)
|
|
: FileMemoryBuffer(first_elem, size),
|
|
std::istream( static_cast<std::streambuf *>(this))
|
|
{}
|
|
};
|
|
}
|
|
|
|
#endif
|
|
|
|
|