Pre simplify w/o SerialImpl
This commit is contained in:
@@ -67,7 +67,6 @@ int glvis_stream::MpiRank() const
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
const auto IsMpiInitialized = []()
|
||||
{
|
||||
int flag;
|
||||
@@ -75,14 +74,6 @@ const auto IsMpiInitialized = []()
|
||||
return flag != 0;
|
||||
};
|
||||
|
||||
const auto GetImpl = [](const bool serial,
|
||||
const std::shared_ptr<GLVisData> &data)
|
||||
-> std::unique_ptr<glvis_stream::IBase>
|
||||
{
|
||||
if (serial) { return std::make_unique<glvis_stream::SerialImpl>(data); }
|
||||
return std::make_unique<glvis_stream::SerialImpl>(data);
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
glvis_stream::glvis_stream(const char*, int, int rank):
|
||||
std::iostream((dbg(rank >= 0 ? "Parallel" : "Serial"), nullptr)),
|
||||
@@ -92,7 +83,7 @@ glvis_stream::glvis_stream(const char*, int, int rank):
|
||||
serial(rank < 0),
|
||||
mpi_root(!mpi_initialized || mpi_rank == 0),
|
||||
data(std::make_shared<GLVisData>()),
|
||||
impl(GetImpl(serial, data))
|
||||
impl(data)
|
||||
{
|
||||
data->serial = serial;
|
||||
data->mpi_root = mpi_root;
|
||||
@@ -100,7 +91,7 @@ glvis_stream::glvis_stream(const char*, int, int rank):
|
||||
if (serial) { assert(rank == -1); }
|
||||
|
||||
// link the stream buffer to the one provided by the implementation
|
||||
this->rdbuf(impl->get_buf());
|
||||
this->rdbuf(impl.get_buf());
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
@@ -113,14 +104,14 @@ glvis_stream& glvis_stream::operator<<(ostream_manipulator pf)
|
||||
return *this;
|
||||
}
|
||||
|
||||
void glvis_stream::flush() { impl->flush(); }
|
||||
void glvis_stream::flush() { impl.flush(); }
|
||||
|
||||
void glvis_stream::glvis()
|
||||
{
|
||||
if (data->serial)
|
||||
{
|
||||
dbg("Serial");
|
||||
const auto size = impl->size();
|
||||
const auto size = impl.size();
|
||||
dbg("stream size: {}", size);
|
||||
assert(size > 0);
|
||||
data->mpi_size = 1;
|
||||
|
||||
+13
-49
@@ -24,60 +24,24 @@ namespace mfem
|
||||
|
||||
class glvis_stream : public std::iostream
|
||||
{
|
||||
public:
|
||||
struct IBase
|
||||
{
|
||||
virtual ~IBase() = default;
|
||||
virtual size_t size() const = 0;
|
||||
virtual std::streambuf* get_buf() = 0;
|
||||
virtual std::streamsize precision() const = 0;
|
||||
virtual std::streamsize precision(std::streamsize) = 0;
|
||||
virtual int open(const char hostname[], int port) = 0;
|
||||
virtual bool is_open() const = 0;
|
||||
virtual int close() = 0;
|
||||
virtual void flush() = 0;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
struct SerialImpl : public IBase
|
||||
struct SerialImpl
|
||||
{
|
||||
const std::shared_ptr<GLVisData> &data;
|
||||
SerialImpl(const std::shared_ptr<GLVisData> &data): data(data)
|
||||
{
|
||||
data->stream.clear();
|
||||
}
|
||||
~SerialImpl() override {}
|
||||
size_t size() const override { return data->stream.tellp(); }
|
||||
std::streambuf *get_buf() override { return data->stream.rdbuf(); }
|
||||
std::streamsize precision() const override { return data->stream.precision(); }
|
||||
std::streamsize precision(std::streamsize prec) override { return data->stream.precision(prec); }
|
||||
int open(const char[], int) override { return 0; }
|
||||
bool is_open() const override { return true; }
|
||||
int close() override { return 0; }
|
||||
void flush() override { data->stream.flush(); }
|
||||
~SerialImpl() {}
|
||||
size_t size() const { return data->stream.tellp(); }
|
||||
std::streambuf *get_buf() { return data->stream.rdbuf(); }
|
||||
std::streamsize precision() const { return data->stream.precision(); }
|
||||
std::streamsize precision(std::streamsize prec) { return data->stream.precision(prec); }
|
||||
int open(const char[], int) { return 0; }
|
||||
bool is_open() const { return true; }
|
||||
int close() { return 0; }
|
||||
void flush() { data->stream.flush(); }
|
||||
};
|
||||
|
||||
#ifdef MFEM_USE_MPI
|
||||
//////////////////////////////////////////////////////////////////
|
||||
struct ParallelImpl : public IBase
|
||||
{
|
||||
const std::shared_ptr<GLVisData> &data;
|
||||
ParallelImpl(const std::shared_ptr<GLVisData> &data): data(data)
|
||||
{
|
||||
data->stream.clear();
|
||||
}
|
||||
~ParallelImpl() override { }
|
||||
size_t size() const override { return data->stream.tellp(); }
|
||||
std::streamsize precision() const override { return data->stream.precision(); }
|
||||
std::streamsize precision(std::streamsize prec) override { return data->stream.precision(prec); }
|
||||
std::streambuf *get_buf() override { return data->stream.rdbuf(); }
|
||||
int open(const char hostname[], int port) override { return 0; }
|
||||
bool is_open() const override { return true; }
|
||||
int close() override { return 0; }
|
||||
void flush() override { data->stream.flush(); }
|
||||
};
|
||||
#endif // MFEM_USE_MPI
|
||||
|
||||
int MpiSize() const;
|
||||
int MpiRank() const;
|
||||
inline bool Root() const { return MpiRank() == 0; }
|
||||
@@ -92,8 +56,8 @@ public:
|
||||
|
||||
virtual ~glvis_stream() {}
|
||||
|
||||
std::streamsize precision() const { return impl->precision(); }
|
||||
std::streamsize precision(std::streamsize new_prec) { return impl->precision(new_prec); }
|
||||
std::streamsize precision() const { return impl.precision(); }
|
||||
std::streamsize precision(std::streamsize new_prec) { return impl.precision(new_prec); }
|
||||
|
||||
using ostream_manipulator = std::ostream& (*)(std::ostream&);
|
||||
glvis_stream& operator<<(ostream_manipulator pf);
|
||||
@@ -120,7 +84,7 @@ private:
|
||||
const int mpi_size, mpi_rank;
|
||||
const bool serial, mpi_root;
|
||||
std::shared_ptr<GLVisData> data;
|
||||
std::unique_ptr<IBase> impl;
|
||||
SerialImpl impl;
|
||||
};
|
||||
|
||||
} // namespace mfem
|
||||
|
||||
Reference in New Issue
Block a user