Pre simplify w/o SerialImpl

This commit is contained in:
camierjs
2026-03-18 10:22:37 -07:00
parent 77fcf08222
commit c577ee0f43
2 changed files with 17 additions and 62 deletions
+4 -13
View File
@@ -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
View File
@@ -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