Program Listing for File History.h

Return to documentation for file (/tmp/ws/src/fastrtps/include/fastdds/rtps/history/History.h)

// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef _FASTDDS_RTPS_HISTORY_H_
#define _FASTDDS_RTPS_HISTORY_H_

#include <fastrtps/fastrtps_dll.h>

#include <fastdds/rtps/history/IChangePool.h>
#include <fastdds/rtps/history/IPayloadPool.h>

#include <fastdds/rtps/common/SequenceNumber.h>
#include <fastdds/rtps/common/Guid.h>
#include <fastdds/rtps/attributes/HistoryAttributes.h>
#include <fastrtps/utils/TimedMutex.hpp>

#include <cassert>
#include <functional>
#include <memory>
#include <mutex>

namespace eprosima {
namespace fastrtps {
namespace rtps {

class History
{
protected:

    History(
            const HistoryAttributes& att);
    History(
            History&&) = delete;
    History& operator =(
            History&&) = delete;
    virtual ~History();

public:

    using iterator = std::vector<CacheChange_t*>::iterator;
    using reverse_iterator = std::vector<CacheChange_t*>::reverse_iterator;
    using const_iterator = std::vector<CacheChange_t*>::const_iterator;

    HistoryAttributes m_att;

    FASTRTPS_DEPRECATED("Use new_change on RTPSWriter or reserveCache on RTPSReader")
    RTPS_DllAPI inline bool reserve_Cache(
            CacheChange_t** change,
            const std::function<uint32_t()>& calculateSizeFunc)
    {
        return do_reserve_cache(change, calculateSizeFunc());
    }

    FASTRTPS_DEPRECATED("Use new_change on RTPSWriter or reserveCache on RTPSReader")
    RTPS_DllAPI inline bool reserve_Cache(
            CacheChange_t** change,
            uint32_t dataSize)
    {
        return do_reserve_cache(change, dataSize);
    }

    FASTRTPS_DEPRECATED("Use release_change on RTPSWriter or releaseCache on RTPSReader")
    RTPS_DllAPI inline void release_Cache(
            CacheChange_t* ch)
    {
        do_release_cache(ch);
    }

    RTPS_DllAPI bool isFull()
    {
        return m_isHistoryFull;
    }

    RTPS_DllAPI size_t getHistorySize()
    {
        std::lock_guard<RecursiveTimedMutex> guard(*mp_mutex);
        return m_changes.size();
    }

    RTPS_DllAPI const_iterator find_change_nts(
            CacheChange_t* ch);

    RTPS_DllAPI virtual iterator remove_change_nts(
            const_iterator removal,
            bool release = true);

    RTPS_DllAPI bool remove_all_changes();

    RTPS_DllAPI bool remove_change(
            CacheChange_t* ch);

    RTPS_DllAPI const_iterator find_change(
            CacheChange_t* ch)
    {
        std::lock_guard<RecursiveTimedMutex> guard(*mp_mutex);
        return find_change_nts(ch);
    }

    RTPS_DllAPI virtual bool matches_change(
            const CacheChange_t* ch_inner,
            CacheChange_t* ch_outer);

    RTPS_DllAPI iterator remove_change(
            const_iterator removal,
            bool release = true)
    {
        std::lock_guard<RecursiveTimedMutex> guard(*mp_mutex);
        return remove_change_nts(removal, release);
    }

    RTPS_DllAPI iterator changesBegin()
    {
        return m_changes.begin();
    }

    RTPS_DllAPI reverse_iterator changesRbegin()
    {
        return m_changes.rbegin();
    }

    RTPS_DllAPI iterator changesEnd()
    {
        return m_changes.end();
    }

    RTPS_DllAPI reverse_iterator changesRend()
    {
        return m_changes.rend();
    }

    RTPS_DllAPI bool get_min_change(
            CacheChange_t** min_change);

    RTPS_DllAPI bool get_max_change(
            CacheChange_t** max_change);

    RTPS_DllAPI inline uint32_t getTypeMaxSerialized()
    {
        return m_att.payloadMaxSize;
    }

    RTPS_DllAPI inline RecursiveTimedMutex* getMutex() const
    {
        assert(mp_mutex != nullptr);
        return mp_mutex;
    }

    RTPS_DllAPI bool get_change(
            const SequenceNumber_t& seq,
            const GUID_t& guid,
            CacheChange_t** change) const;

    const_iterator get_change_nts(
            const SequenceNumber_t& seq,
            const GUID_t& guid,
            CacheChange_t** change,
            const_iterator hint) const;

    bool get_earliest_change(
            CacheChange_t** change);

protected:

    std::vector<CacheChange_t*> m_changes;

    bool m_isHistoryFull = false;

    RecursiveTimedMutex* mp_mutex = nullptr;

    void print_changes_seqNum2();

    RTPS_DllAPI virtual bool do_reserve_cache(
            CacheChange_t** change,
            uint32_t size) = 0;

    RTPS_DllAPI virtual void do_release_cache(
            CacheChange_t* ch) = 0;

};

} // namespace rtps
} // namespace fastrtps
} // namespace eprosima

#endif /* _FASTDDS_RTPS_HISTORY_H_ */