Loading...
Searching...
No Matches
LammpsLoader.h
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#pragma once
13
19
20#include "eon/DynLib.h"
21
22#include <stdexcept>
23#include <string>
24
25#ifdef EONMPI
26#include <mpi.h>
27#endif
28
29namespace eonc {
30
31// ---------------------------------------------------------------------------
32// ILammpsLoader: injectable ABI. Production uses LammpsLoader::instance().
33// ---------------------------------------------------------------------------
35public:
36 // LAMMPS C API function pointer types (from library.h)
37 using open_no_mpi_fn = void *(*)(int, char **, void **);
38 using close_fn = void (*)(void *);
39 using command_fn = char *(*)(void *, const char *);
40 using file_fn = void (*)(void *, const char *);
41 using scatter_atoms_fn = void (*)(void *, const char *, int, int, void *);
42 using extract_var_fn = void *(*)(void *, const char *, const char *);
43#ifdef EONMPI
44 using open_mpi_fn = void *(*)(int, char **, MPI_Comm, void **);
45#endif
46
48 close_fn close{nullptr};
50 file_fn file{nullptr};
53#ifdef EONMPI
54 open_mpi_fn open_mpi{nullptr};
55#endif
56
57 virtual ~ILammpsLoader() = default;
58 virtual void require_loaded() = 0;
59 [[nodiscard]] virtual bool is_loaded() const noexcept = 0;
60 [[nodiscard]] virtual bool available() const = 0;
61 [[nodiscard]] virtual const std::string &last_error() const noexcept = 0;
62
63 ILammpsLoader(const ILammpsLoader &) = delete;
64 ILammpsLoader &operator=(const ILammpsLoader &) = delete;
65
66protected:
67 ILammpsLoader() = default;
68};
69
70// ---------------------------------------------------------------------------
71// LammpsLoader: process-default loader (Meyer's singleton). Does not dlopen
72// until require_loaded().
73// ---------------------------------------------------------------------------
75public:
77 static LammpsLoader &instance();
78
79 [[nodiscard]] bool is_loaded() const noexcept override { return m_loaded; }
80
83 [[nodiscard]] bool available() const override;
84
86 [[nodiscard]] const std::string &last_error() const noexcept override {
87 return m_last_error;
88 }
89
91 void require_loaded() override;
92
93 LammpsLoader(const LammpsLoader &) = delete;
95
96private:
97 LammpsLoader() = default;
98 ~LammpsLoader() override;
99
100 void ensure_loaded();
101
102 bool m_loaded{false};
103 bool m_tried{false};
105 std::string m_last_error{};
106
108 template <typename Fn> Fn load_sym(const char *name) {
109 return reinterpret_cast<Fn>(dynlib::sym(m_handle, name));
110 }
111};
112
113} // namespace eonc
void *(*)(void *, const char *, const char *) extract_var_fn
ILammpsLoader(const ILammpsLoader &)=delete
open_no_mpi_fn open_no_mpi
void *(*)(int, char **, void **) open_no_mpi_fn
virtual bool available() const =0
extract_var_fn extract_variable
void(*)(void *, const char *) file_fn
scatter_atoms_fn scatter_atoms
virtual bool is_loaded() const noexcept=0
virtual ~ILammpsLoader()=default
void(*)(void *) close_fn
void(*)(void *, const char *, int, int, void *) scatter_atoms_fn
char *(*)(void *, const char *) command_fn
virtual void require_loaded()=0
virtual const std::string & last_error() const noexcept=0
const std::string & last_error() const noexcept override
Why the last ensure_loaded() failed. Empty if unused or loaded.
bool is_loaded() const noexcept override
LammpsLoader(const LammpsLoader &)=delete
Fn load_sym(const char *name)
Try to load a symbol; returns nullptr on failure.
LammpsLoader & operator=(const LammpsLoader &)=delete
std::string m_last_error
static LammpsLoader & instance()
Thread-safe singleton accessor (Meyer's pattern). Does not dlopen.
dynlib::Handle m_handle
LammpsLoader()=default
void * sym(Handle h, const char *name) noexcept
Definition DynLib.h:75
void * Handle
Definition DynLib.h:60
RAII resource manager for the ARTn C library with global synchronization.