feat: Add Doxygen documentation and Gitea workflow

This commit introduces Doxygen for documentation generation and a Gitea
workflow for continuous integration.

- Adds a `Doxyfile` to configure Doxygen to build a documentation
  website with diagrams.
- Updates `AGENTS.md` to require Doxygen-compatible comments for all
  code.
- Adds Doxygen comments to existing C++ source files to comply with
  the new standard.
- Creates a Gitea workflow (`.gitea/workflows/build.yml`) that:
  - Builds the project on every push.
  - Generates Doxygen documentation.
  - Uploads the compiled library and the documentation website as
    artifacts.
This commit is contained in:
google-labs-jules[bot]
2025-08-18 09:56:29 +00:00
parent 043e89ddfe
commit bfa583d574
5 changed files with 128 additions and 1 deletions
+33
View File
@@ -0,0 +1,33 @@
name: Build and Test
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y g++ cmake doxygen graphviz
- name: Build
run: ./build.sh
- name: Generate Documentation
run: doxygen Doxyfile
- name: Upload Library Artifact
uses: actions/upload-artifact@v4
with:
name: medical-lib
path: build/lib
- name: Upload Documentation Artifact
uses: actions/upload-artifact@v4
with:
name: documentation
path: docs/html
+23
View File
@@ -31,6 +31,29 @@ To build the project, use the provided build scripts:
The compiled library will be placed in `build/lib`, and the example executable will be in `build/examples/`. The compiled library will be placed in `build/lib`, and the example executable will be in `build/examples/`.
## Coding Standards
### Doxygen Documentation
All functions, classes, structs, enums, and public member variables must be documented using Doxygen-compatible comments. This ensures that the code is easy to understand and that high-quality documentation can be automatically generated.
- Use `/** ... */` for multi-line comments.
- Use `///` for single-line comments.
- Use `@brief` to provide a short description.
- Use `@param` to document function parameters.
- Use `@return` to describe the return value.
Example:
```cpp
/**
* @brief Calculates the Body Mass Index (BMI).
* @param weight_kg The weight in kilograms.
* @param height_m The height in meters.
* @return The calculated BMI.
*/
MEDICAL_LIB_API double calculateBMI(double weight_kg, double height_m);
```
## Integration with Unreal Engine ## Integration with Unreal Engine
To use this library in an Unreal Engine plugin: To use this library in an Unreal Engine plugin:
+49
View File
@@ -0,0 +1,49 @@
# Doxyfile 1.9.1
# Project
PROJECT_NAME = "MedicalLib"
PROJECT_NUMBER = 1.0
PROJECT_BRIEF = "A C++ library for medical simulations"
OUTPUT_DIRECTORY = "docs"
CREATE_SUBDIRS = YES
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
# Sources
INPUT = ./include ./src
FILE_PATTERNS = *.h *.cpp
RECURSIVE = YES
EXCLUDE_PATTERNS =
EXCLUDE_SYMBOLS =
# HTML
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
# Diagrams
HAVE_DOT = YES
DOT_TOOL_PATH =
DOTFILE_DIRS =
UML_LOOK = YES
UML_LIMIT_NUM_FIELDS = 10
TEMPLATE_RELATIONS = YES
CALL_GRAPH = YES
CALLER_GRAPH = YES
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
INTERACTIVE_SVG = NO
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = YES
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
+7
View File
@@ -1,6 +1,13 @@
#include "MedicalLib/MedicalLib.h" #include "MedicalLib/MedicalLib.h"
#include <stdexcept> #include <stdexcept>
/**
* @brief Calculates the Body Mass Index (BMI).
* @param weight_kg The weight in kilograms.
* @param height_m The height in meters.
* @return The calculated BMI.
* @throws std::invalid_argument if height or weight are non-positive.
*/
double calculateBMI(double weight_kg, double height_m) { double calculateBMI(double weight_kg, double height_m) {
if (height_m <= 0) { if (height_m <= 0) {
throw std::invalid_argument("Height must be positive."); throw std::invalid_argument("Height must be positive.");
+16 -1
View File
@@ -2,7 +2,11 @@
#include <random> #include <random>
#include <algorithm> // For std::clamp #include <algorithm> // For std::clamp
// Helper function to generate random fluctuations /**
* @brief Helper function to generate random fluctuations from a normal distribution.
* @param stddev The standard deviation of the distribution.
* @return A random value.
*/
double getFluctuation(double stddev) { double getFluctuation(double stddev) {
static std::random_device rd; static std::random_device rd;
static std::mt19937 gen(rd()); static std::mt19937 gen(rd());
@@ -10,6 +14,11 @@ double getFluctuation(double stddev) {
return d(gen); return d(gen);
} }
/**
* @brief Initializes a new patient with baseline vital signs.
* @param patientId The ID for the new patient.
* @return A Patient struct with default healthy values.
*/
Patient initializePatient(int patientId) { Patient initializePatient(int patientId) {
Patient patient; Patient patient;
patient.patientId = patientId; patient.patientId = patientId;
@@ -22,6 +31,12 @@ Patient initializePatient(int patientId) {
return patient; return patient;
} }
/**
* @brief Updates the patient's vital signs based on the time elapsed.
* This function simulates minor, random fluctuations around a healthy baseline.
* @param patient The patient to update.
* @param deltaTime_s The time elapsed in seconds.
*/
void updatePatient(Patient& patient, double deltaTime_s) { void updatePatient(Patient& patient, double deltaTime_s) {
// Baseline healthy values // Baseline healthy values
const double baseline_hr = 75.0; const double baseline_hr = 75.0;