/* ***********************************************************************
//
//   Copyright (C) 2025 -- The 4D-STAR Collaboration
//   File Author: Emily Boudreaux
//   Last Modified: January 19, 2025
//
//   4DSSE is free software; you can use it and/or modify
//   it under the terms and restrictions the GNU General Library Public
//   License version 3 (GPLv3) as published by the Free Software Foundation.
//
//   4DSSE is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//   See the GNU Library General Public License for more details.
//
//   You should have received a copy of the GNU Library General Public License
//   along with this software; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// *********************************************************************** */
#ifndef LOCKABLE_DOBJECT_H
#define LOCKABLE_DOBJECT_H

#include "DObject.h"
#include <mutex>

/**
 * @file LockableDObject.h
 * @brief A lightweight wrapper for DObject that adds locking capabilities.
 *
 * This class allows safe concurrent access to a DObject by providing
 * locking and unlocking methods.
 */

/**
 * @class LockableDObject
 * @brief Wrapper for DObject with thread-safe access.
 */
class LockableDObject {
public:
    /**
     * @brief Default constructor.
     */
    LockableDObject() = default;

    /**
     * @brief Access the underlying DObject.
     * @return A reference to the wrapped DObject.
     */
    DObject& get();

    /**
     * @brief Locks the mutex to ensure thread-safe access.
     */
    void lock();

    /**
     * @brief Unlocks the mutex after thread-safe access.
     */
    void unlock();

private:
    DObject object_;        ///< The underlying DObject instance.
    std::mutex mutex_;      ///< Mutex for thread-safe access.
};

#endif // LOCKABLE_DOBJECT_H