PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::integration::logger_adapter Class Reference

Adapter for DICOM audit logging using logger_system. More...

#include <logger_adapter.h>

Collaboration diagram for kcenon::pacs::integration::logger_adapter:
Collaboration graph

Classes

class  impl
 

Static Public Member Functions

static void initialize (const logger_config &config)
 Initialize the logger with configuration.
 
static void shutdown ()
 Shutdown the logger.
 
static auto is_initialized () noexcept -> bool
 Check if the logger is initialized.
 
template<typename... Args>
static void trace (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log a trace-level message.
 
template<typename... Args>
static void debug (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log a debug-level message.
 
template<typename... Args>
static void info (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log an info-level message.
 
template<typename... Args>
static void warn (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log a warning-level message.
 
template<typename... Args>
static void error (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log an error-level message.
 
template<typename... Args>
static void fatal (kcenon::pacs::compat::format_string< Args... > fmt, Args &&... args)
 Log a fatal-level message.
 
static void log (log_level level, const std::string &message)
 Log a message at the specified level.
 
static auto is_level_enabled (log_level level) noexcept -> bool
 Check if a log level is enabled.
 
static void flush ()
 Flush all pending log messages.
 
static void log_association_established (const std::string &calling_ae, const std::string &called_ae, const std::string &remote_ip)
 Log DICOM association establishment.
 
static void log_association_released (const std::string &calling_ae, const std::string &called_ae)
 Log DICOM association release.
 
static void log_c_store_received (const std::string &calling_ae, const std::string &patient_id, const std::string &study_uid, const std::string &sop_instance_uid, storage_status status)
 Log C-STORE operation.
 
static void log_c_find_executed (const std::string &calling_ae, query_level level, std::size_t matches_returned)
 Log C-FIND operation.
 
static void log_c_move_executed (const std::string &calling_ae, const std::string &destination_ae, const std::string &study_uid, std::size_t instances_moved, move_status status)
 Log C-MOVE operation.
 
static void log_security_event (security_event_type type, const std::string &description, const std::string &user_id="")
 Log a security-related event.
 
static void set_min_level (log_level level)
 Set the minimum log level.
 
static auto get_min_level () noexcept -> log_level
 Get the current minimum log level.
 
static auto get_config () -> const logger_config &
 Get the current configuration.
 

Static Private Member Functions

static void write_audit_log (const std::string &event_type, const std::string &outcome, const std::map< std::string, std::string > &fields)
 
static auto storage_status_to_string (storage_status status) -> std::string
 
static auto move_status_to_string (move_status status) -> std::string
 
static auto query_level_to_string (query_level level) -> std::string
 
static auto security_event_to_string (security_event_type type) -> std::string
 
static auto log_level_to_string (log_level level) -> std::string
 

Static Private Attributes

static std::unique_ptr< implpimpl_ = nullptr
 

Detailed Description

Adapter for DICOM audit logging using logger_system.

This class provides a unified interface for logging in the PACS system, including:

  • Standard application logging (trace through fatal)
  • DICOM-specific audit logging for HIPAA/regulatory compliance
  • Security event logging for access control and intrusion detection

The adapter uses logger_system's high-performance async logging (4.34M msg/s) internally while providing a PACS-specific API.

Thread Safety: All methods are thread-safe.

Definition at line 184 of file logger_adapter.h.

Member Function Documentation

◆ debug()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::debug ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

◆ error()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::error ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

◆ fatal()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::fatal ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

Log a fatal-level message.

Template Parameters
ArgsFormat argument types
Parameters
fmtFormat string (std::format syntax)
argsFormat arguments

Definition at line 281 of file logger_adapter.h.

281 {
282 log(log_level::fatal, kcenon::pacs::compat::format(fmt, std::forward<Args>(args)...));
283 }

References kcenon::pacs::integration::fatal, and log().

Here is the call graph for this function:

◆ flush()

void kcenon::pacs::integration::logger_adapter::flush ( )
static

Flush all pending log messages.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 342 of file logger_adapter.cpp.

342{}

◆ get_config()

auto kcenon::pacs::integration::logger_adapter::get_config ( ) -> const logger_config&
staticnodiscard

Get the current configuration.

Returns
Current logger configuration
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 346 of file logger_adapter.cpp.

346 {
347 static const logger_config default_config;
348 return default_config;
349}

◆ get_min_level()

auto kcenon::pacs::integration::logger_adapter::get_min_level ( ) -> log_level
staticnodiscardnoexcept

Get the current minimum log level.

Returns
Current minimum log level
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 344 of file logger_adapter.cpp.

References kcenon::pacs::integration::off.

◆ info()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::info ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

Log an info-level message.

Template Parameters
ArgsFormat argument types
Parameters
fmtFormat string (std::format syntax)
argsFormat arguments

Definition at line 248 of file logger_adapter.h.

248 {
249 log(log_level::info, kcenon::pacs::compat::format(fmt, std::forward<Args>(args)...));
250 }

References kcenon::pacs::integration::info, and log().

Referenced by ai_service_connector::impl::cancel(), kcenon::pacs::workflow::task_scheduler::cancel_task(), kcenon::pacs::workflow::task_scheduler::create_archive_callback(), kcenon::pacs::workflow::task_scheduler::create_cleanup_callback(), kcenon::pacs::workflow::task_scheduler::create_verification_callback(), kcenon::pacs::workflow::auto_prefetch_service::execute_cycle(), kcenon::pacs::workflow::task_scheduler::execute_cycle(), kcenon::pacs::workflow::task_scheduler::execute_task(), ai_service_connector::impl::initialize(), kcenon::pacs::workflow::task_scheduler::load_tasks(), kcenon::pacs::workflow::task_scheduler::pause_task(), kcenon::pacs::workflow::auto_prefetch_service::prefetch_study(), ai_service_connector::impl::request_inference(), kcenon::pacs::workflow::task_scheduler::resume_task(), kcenon::pacs::workflow::task_scheduler::schedule(), ai_service_connector::impl::shutdown(), kcenon::pacs::workflow::auto_prefetch_service::start(), kcenon::pacs::workflow::task_scheduler::start(), kcenon::pacs::workflow::auto_prefetch_service::stop(), kcenon::pacs::workflow::task_scheduler::stop(), kcenon::pacs::workflow::task_scheduler::trigger_task(), ai_service_connector::impl::update_credentials(), and kcenon::pacs::workflow::task_scheduler::update_schedule().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ initialize()

void kcenon::pacs::integration::logger_adapter::initialize ( const logger_config & config)
static

Initialize the logger with configuration.

Must be called before any logging operations. Sets up console and file writers, configures log levels, and initializes the audit logger if enabled.

Parameters
configConfiguration options
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 337 of file logger_adapter.cpp.

337{}

◆ is_initialized()

auto kcenon::pacs::integration::logger_adapter::is_initialized ( ) -> bool
staticnodiscardnoexcept

Check if the logger is initialized.

Returns
true if initialized, false otherwise
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 339 of file logger_adapter.cpp.

339{ return false; }

◆ is_level_enabled()

auto kcenon::pacs::integration::logger_adapter::is_level_enabled ( log_level level) -> bool
staticnodiscardnoexcept

Check if a log level is enabled.

Parameters
levelThe level to check
Returns
true if messages at this level will be logged
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 341 of file logger_adapter.cpp.

341{ return false; }

Referenced by kcenon::pacs::di::LoggerService::is_enabled().

Here is the caller graph for this function:

◆ log()

void kcenon::pacs::integration::logger_adapter::log ( log_level level,
const std::string & message )
static

◆ log_association_established()

void kcenon::pacs::integration::logger_adapter::log_association_established ( const std::string & calling_ae,
const std::string & called_ae,
const std::string & remote_ip )
static

Log DICOM association establishment.

Records when a remote system connects and establishes a DICOM association.

Parameters
calling_aeAE title of the remote system
called_aeAE title of this system
remote_ipIP address of the remote system
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 362 of file logger_adapter.cpp.

364 {
365 info("Association established: {} -> {} from {}",
366 calling_ae, called_ae, remote_ip);
367
368 write_audit_log("ASSOCIATION_ESTABLISHED", "success",
369 {{"calling_ae", calling_ae},
370 {"called_ae", called_ae},
371 {"remote_ip", remote_ip}});
372}
static void write_audit_log(const std::string &event_type, const std::string &outcome, const std::map< std::string, std::string > &fields)

References kcenon::pacs::integration::info, and write_audit_log().

Here is the call graph for this function:

◆ log_association_released()

void kcenon::pacs::integration::logger_adapter::log_association_released ( const std::string & calling_ae,
const std::string & called_ae )
static

Log DICOM association release.

Records when a DICOM association is gracefully released.

Parameters
calling_aeAE title of the remote system
called_aeAE title of this system
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 374 of file logger_adapter.cpp.

375 {
376 debug("Association released: {} -> {}", calling_ae, called_ae);
377
378 write_audit_log("ASSOCIATION_RELEASED", "success",
379 {{"calling_ae", calling_ae}, {"called_ae", called_ae}});
380}

References kcenon::pacs::integration::debug, and write_audit_log().

Here is the call graph for this function:

◆ log_c_find_executed()

void kcenon::pacs::integration::logger_adapter::log_c_find_executed ( const std::string & calling_ae,
query_level level,
std::size_t matches_returned )
static

Log C-FIND operation.

Records when a query is executed against the PACS database.

Parameters
calling_aeAE title of the querying system
levelQuery retrieve level (patient, study, series, image)
matches_returnedNumber of matching records returned
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 406 of file logger_adapter.cpp.

408 {
409 auto level_str = query_level_to_string(level);
410
411 debug("C-FIND executed: level={} matches={} from {}",
412 level_str, matches_returned, calling_ae);
413
414 write_audit_log("C-FIND", "success",
415 {{"calling_ae", calling_ae},
416 {"query_level", level_str},
417 {"matches_returned", std::to_string(matches_returned)}});
418}
static auto query_level_to_string(query_level level) -> std::string

References kcenon::pacs::integration::debug, query_level_to_string(), and write_audit_log().

Here is the call graph for this function:

◆ log_c_move_executed()

void kcenon::pacs::integration::logger_adapter::log_c_move_executed ( const std::string & calling_ae,
const std::string & destination_ae,
const std::string & study_uid,
std::size_t instances_moved,
move_status status )
static

Log C-MOVE operation.

Records when images are transferred to another system.

Parameters
calling_aeAE title requesting the move
destination_aeAE title of the destination
study_uidStudy Instance UID being moved
instances_movedNumber of instances successfully moved
statusStatus of the move operation
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 420 of file logger_adapter.cpp.

424 {
425 auto outcome = (status == move_status::success ||
427 ? "success"
428 : "failure";
429 auto status_str = move_status_to_string(status);
430
431 if (status == move_status::success) {
432 info("C-MOVE completed: study={} instances={} to {} from {}",
433 study_uid, instances_moved, destination_ae, calling_ae);
434 } else {
435 warn("C-MOVE failed: study={} status={} to {} from {}",
436 study_uid, status_str, destination_ae, calling_ae);
437 }
438
439 write_audit_log("C-MOVE", outcome,
440 {{"calling_ae", calling_ae},
441 {"destination_ae", destination_ae},
442 {"study_uid", study_uid},
443 {"instances_moved", std::to_string(instances_moved)},
444 {"status", status_str}});
445}
static auto move_status_to_string(move_status status) -> std::string
constexpr dicom_tag status
Status.

References kcenon::pacs::integration::info, move_status_to_string(), kcenon::pacs::integration::partial_success, kcenon::pacs::integration::success, kcenon::pacs::integration::warn, and write_audit_log().

Here is the call graph for this function:

◆ log_c_store_received()

void kcenon::pacs::integration::logger_adapter::log_c_store_received ( const std::string & calling_ae,
const std::string & patient_id,
const std::string & study_uid,
const std::string & sop_instance_uid,
storage_status status )
static

Log C-STORE operation.

Records when a DICOM object is received via C-STORE. This is critical for HIPAA audit trail requirements.

Parameters
calling_aeAE title of the sender
patient_idPatient ID from the received object
study_uidStudy Instance UID
sop_instance_uidSOP Instance UID of the stored object
statusStatus of the storage operation
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 382 of file logger_adapter.cpp.

386 {
387 auto outcome = (status == storage_status::success) ? "success" : "failure";
388 auto status_str = storage_status_to_string(status);
389
390 if (status == storage_status::success) {
391 info("C-STORE received: patient={} study={} instance={} from {}",
392 patient_id, study_uid, sop_instance_uid, calling_ae);
393 } else {
394 warn("C-STORE failed: patient={} status={} from {}",
395 patient_id, status_str, calling_ae);
396 }
397
398 write_audit_log("C-STORE", outcome,
399 {{"calling_ae", calling_ae},
400 {"patient_id", patient_id},
401 {"study_uid", study_uid},
402 {"sop_instance_uid", sop_instance_uid},
403 {"status", status_str}});
404}
static auto storage_status_to_string(storage_status status) -> std::string
constexpr dicom_tag patient_id
Patient ID.
constexpr dicom_tag sop_instance_uid
SOP Instance UID.

References kcenon::pacs::integration::info, storage_status_to_string(), kcenon::pacs::integration::success, kcenon::pacs::integration::warn, and write_audit_log().

Here is the call graph for this function:

◆ log_level_to_string()

auto kcenon::pacs::integration::logger_adapter::log_level_to_string ( log_level level) -> std::string
staticnodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 563 of file logger_adapter.cpp.

563 {
564 switch (level) {
565 case log_level::trace:
566 return "TRACE";
567 case log_level::debug:
568 return "DEBUG";
569 case log_level::info:
570 return "INFO";
571 case log_level::warn:
572 return "WARN";
573 case log_level::error:
574 return "ERROR";
575 case log_level::fatal:
576 return "FATAL";
577 case log_level::off:
578 default:
579 return "OFF";
580 }
581}

References kcenon::pacs::integration::debug, kcenon::pacs::integration::error, kcenon::pacs::integration::fatal, kcenon::pacs::integration::info, kcenon::pacs::integration::off, kcenon::pacs::integration::trace, and kcenon::pacs::integration::warn.

◆ log_security_event()

void kcenon::pacs::integration::logger_adapter::log_security_event ( security_event_type type,
const std::string & description,
const std::string & user_id = "" )
static

Log a security-related event.

Records security events for audit and intrusion detection.

Parameters
typeType of security event
descriptionHuman-readable description
user_idOptional user or system identifier
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 447 of file logger_adapter.cpp.

449 {
450 auto type_str = security_event_to_string(type);
451
452 // Security events are always logged at warn level or higher
453 switch (type) {
455 info("Security event: {} - {}", type_str, description);
456 break;
461 warn("Security event: {} - {}", type_str, description);
462 break;
465 info("Security event: {} - {}", type_str, description);
466 break;
467 }
468
469 std::map<std::string, std::string> fields = {
470 {"security_event", type_str}, {"description", description}};
471
472 if (!user_id.empty()) {
473 fields["user_id"] = user_id;
474 }
475
476 write_audit_log("SECURITY", security_event_to_string(type), fields);
477}
static auto security_event_to_string(security_event_type type) -> std::string

References kcenon::pacs::integration::access_denied, kcenon::pacs::integration::association_rejected, kcenon::pacs::integration::authentication_failure, kcenon::pacs::integration::authentication_success, kcenon::pacs::integration::configuration_change, kcenon::pacs::integration::data_export, kcenon::pacs::integration::info, kcenon::pacs::integration::invalid_request, security_event_to_string(), kcenon::pacs::integration::warn, and write_audit_log().

Here is the call graph for this function:

◆ move_status_to_string()

auto kcenon::pacs::integration::logger_adapter::move_status_to_string ( move_status status) -> std::string
staticnodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 505 of file logger_adapter.cpp.

505 {
506 switch (status) {
508 return "Success";
510 return "PartialSuccess";
512 return "RefusedOutOfResources";
514 return "RefusedMoveDestinationUnknown";
516 return "IdentifierDoesNotMatch";
518 return "UnableToProcess";
520 return "Cancelled";
522 default:
523 return "UnknownError";
524 }
525}

References kcenon::pacs::integration::cancelled, kcenon::pacs::integration::identifier_does_not_match, kcenon::pacs::integration::partial_success, kcenon::pacs::integration::refused_move_destination_unknown, kcenon::pacs::integration::refused_out_of_resources, kcenon::pacs::integration::success, kcenon::pacs::integration::unable_to_process, and kcenon::pacs::integration::unknown_error.

Referenced by log_c_move_executed().

Here is the caller graph for this function:

◆ query_level_to_string()

auto kcenon::pacs::integration::logger_adapter::query_level_to_string ( query_level level) -> std::string
staticnodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 527 of file logger_adapter.cpp.

527 {
528 switch (level) {
530 return "PATIENT";
532 return "STUDY";
534 return "SERIES";
536 return "IMAGE";
537 default:
538 return "UNKNOWN";
539 }
540}

References kcenon::pacs::integration::image, kcenon::pacs::integration::patient, kcenon::pacs::integration::series, and kcenon::pacs::integration::study.

Referenced by log_c_find_executed().

Here is the caller graph for this function:

◆ security_event_to_string()

auto kcenon::pacs::integration::logger_adapter::security_event_to_string ( security_event_type type) -> std::string
staticnodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 542 of file logger_adapter.cpp.

542 {
543 switch (type) {
545 return "authentication_success";
547 return "authentication_failure";
549 return "access_denied";
551 return "configuration_change";
553 return "data_export";
555 return "association_rejected";
557 return "invalid_request";
558 default:
559 return "unknown";
560 }
561}

References kcenon::pacs::integration::access_denied, kcenon::pacs::integration::association_rejected, kcenon::pacs::integration::authentication_failure, kcenon::pacs::integration::authentication_success, kcenon::pacs::integration::configuration_change, kcenon::pacs::integration::data_export, and kcenon::pacs::integration::invalid_request.

Referenced by log_security_event().

Here is the caller graph for this function:

◆ set_min_level()

void kcenon::pacs::integration::logger_adapter::set_min_level ( log_level level)
static

Set the minimum log level.

Parameters
levelNew minimum log level
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 343 of file logger_adapter.cpp.

343{}

◆ shutdown()

void kcenon::pacs::integration::logger_adapter::shutdown ( )
static

Shutdown the logger.

Flushes all pending messages and releases resources. Should be called before application exit.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 338 of file logger_adapter.cpp.

338{}

◆ storage_status_to_string()

auto kcenon::pacs::integration::logger_adapter::storage_status_to_string ( storage_status status) -> std::string
staticnodiscardprivate
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/integration/logger_adapter.h.

Definition at line 483 of file logger_adapter.cpp.

483 {
484 switch (status) {
486 return "Success";
488 return "OutOfResources";
490 return "DataSetError";
492 return "CannotUnderstand";
494 return "ProcessingFailure";
496 return "DuplicateRejected";
498 return "DuplicateStored";
500 default:
501 return "UnknownError";
502 }
503}

References kcenon::pacs::integration::cannot_understand, kcenon::pacs::integration::dataset_error, kcenon::pacs::integration::duplicate_rejected, kcenon::pacs::integration::duplicate_stored, kcenon::pacs::integration::out_of_resources, kcenon::pacs::integration::processing_failure, kcenon::pacs::integration::success, and kcenon::pacs::integration::unknown_error.

Referenced by log_c_store_received().

Here is the caller graph for this function:

◆ trace()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::trace ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

Log a trace-level message.

Template Parameters
ArgsFormat argument types
Parameters
fmtFormat string (std::format syntax)
argsFormat arguments

Definition at line 226 of file logger_adapter.h.

226 {
227 log(log_level::trace, kcenon::pacs::compat::format(fmt, std::forward<Args>(args)...));
228 }

References log(), and kcenon::pacs::integration::trace.

Here is the call graph for this function:

◆ warn()

template<typename... Args>
static void kcenon::pacs::integration::logger_adapter::warn ( kcenon::pacs::compat::format_string< Args... > fmt,
Args &&... args )
inlinestatic

Log a warning-level message.

Template Parameters
ArgsFormat argument types
Parameters
fmtFormat string (std::format syntax)
argsFormat arguments

Definition at line 259 of file logger_adapter.h.

259 {
260 log(log_level::warn, kcenon::pacs::compat::format(fmt, std::forward<Args>(args)...));
261 }

References log(), and kcenon::pacs::integration::warn.

Referenced by kcenon::pacs::workflow::task_scheduler::create_archive_callback(), kcenon::pacs::workflow::task_scheduler::create_cleanup_callback(), kcenon::pacs::workflow::task_scheduler::create_verification_callback(), kcenon::pacs::workflow::task_scheduler::deserialize_tasks(), kcenon::pacs::workflow::task_scheduler::execute_task(), and ai_service_connector::impl::initialize().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ write_audit_log()

void kcenon::pacs::integration::logger_adapter::write_audit_log ( const std::string & event_type,
const std::string & outcome,
const std::map< std::string, std::string > & fields )
staticprivate

Member Data Documentation

◆ pimpl_

std::unique_ptr< logger_adapter::impl > kcenon::pacs::integration::logger_adapter::pimpl_ = nullptr
staticprivate

The documentation for this class was generated from the following files: