ralpha-assets/Plugins/CesiumForUnreal/Source/ThirdParty/include/CesiumUtility/CreditReferencer.h

123 lines
3.6 KiB
C++

#pragma once
#include <cstdint>
#include <memory>
#include <vector>
namespace CesiumUtility {
class CreditSystem;
struct Credit;
/**
* @brief Provides a way to reference a set of credits in a
* {@link CreditSystem} so that the references can easily be released later.
*
* Multiple CreditReferencers may be used on the same credit system to track
* separate sets of references -- e.g., two sets of credits from different
* frames.
*/
class CreditReferencer {
public:
/**
* @brief Constructs a new credit referencer without a credit system.
*
* The methods on this instance will have no effect before the credit system
* is set by calling {@link setCreditSystem}.
*/
CreditReferencer() noexcept;
/**
* @brief Constructs a new credit referencer.
*
* @param pCreditSystem The credit system that owns the referenced credits.
* This may be nullptr, but methods on this instance will have no effect
* before the credit system is set.
*/
CreditReferencer(const std::shared_ptr<CreditSystem>& pCreditSystem) noexcept;
/**
* @brief Copies an instance, increasing the credit references on the
* {@link CreditSystem} accordingly.
*
* @param rhs The instance to copy.
*/
CreditReferencer(const CreditReferencer& rhs) noexcept;
/**
* @brief Moves an instance. After the move, the `rhs` will not own any
* references, so this operation does not affect the total number of credit
* references on the {@link CreditSystem}.
*
* @param rhs The instance to move.
*/
CreditReferencer(CreditReferencer&& rhs) noexcept;
/**
* @brief Destroys this instance, releasing all of its references.
*/
~CreditReferencer() noexcept;
/**
* @brief Copy-assigns another instance to this one. The `rhs` references are
* copied to this instance and then all credit references previously owned by
* this instance are released.
*
* @param rhs The instance to copy.
* @returns A reference to this instance.
*/
CreditReferencer& operator=(const CreditReferencer& rhs) noexcept;
/**
* @brief Move-assigns another instance to this one. The `rhs` references are
* moved to this instance and then all credit references previously owned by
* this instance are released.
*
* @param rhs The instance to move.
* @return A reference to this instance.
*/
CreditReferencer& operator=(CreditReferencer&& rhs) noexcept;
/**
* @brief Gets the credit system that this instance references.
*/
const std::shared_ptr<CreditSystem>& getCreditSystem() const noexcept;
/**
* @brief Sets the credit system that this instance references.
*
* If the specified credit system is different from the current one, this
* method will clear all current credit references.
*
* @param pCreditSystem The new credit system.
*/
void
setCreditSystem(const std::shared_ptr<CreditSystem>& pCreditSystem) noexcept;
/**
* @brief Adds a reference to a credit.
*
* @param credit The credit to reference.
*/
void addCreditReference(Credit credit) noexcept;
/**
* @brief Releases all references that have been added to this instance.
*/
void releaseAllReferences() noexcept;
/**
* @brief Tests if a credit is referenced by this referencer.
*
* @param credit The credit to test if it is referenced.
*/
bool isCreditReferenced(Credit credit) const noexcept;
private:
std::shared_ptr<CreditSystem> _pCreditSystem;
std::vector<int32_t> _references;
std::vector<uint32_t> _generations;
};
} // namespace CesiumUtility