/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef LOGGING_RTC_EVENT_LOG_RTC_EVENT_PROCESSOR_H_ #define LOGGING_RTC_EVENT_LOG_RTC_EVENT_PROCESSOR_H_ #include <stdint.h> #include <functional> #include <memory> #include <type_traits> #include <vector> #include "absl/types/optional.h" #include "logging/rtc_event_log/rtc_event_log_parser.h" #include "logging/rtc_event_log/rtc_event_processor_order.h" #include "rtc_base/checks.h" namespace webrtc { // This file contains helper class used to process the elements of two or more // sorted lists in timestamp order. The effect is the same as doing a merge step // in the merge-sort algorithm but without copying the elements or modifying the // lists. namespace event_processor_impl { // Interface to allow "merging" lists of different types. ProcessNext() // processes the next unprocessed element in the list. IsEmpty() checks if all // elements have been processed. GetNextTime returns the timestamp of the next // unprocessed element. class ProcessableEventListInterface { … }; // ProcessableEventList encapsulates a list of events and a function that will // be applied to each element of the list. template <typename Iterator, typename T> class ProcessableEventList : public ProcessableEventListInterface { … }; } // namespace event_processor_impl // Helper class used to "merge" two or more lists of ordered RtcEventLog events // so that they can be treated as a single ordered list. Since the individual // lists may have different types, we need to access the lists via pointers to // the common base class. // // Usage example: // ParsedRtcEventLogNew log; // auto incoming_handler = [] (LoggedRtcpPacketIncoming elem) { ... }; // auto outgoing_handler = [] (LoggedRtcpPacketOutgoing elem) { ... }; // // RtcEventProcessor processor; // processor.AddEvents(log.incoming_rtcp_packets(), // incoming_handler); // processor.AddEvents(log.outgoing_rtcp_packets(), // outgoing_handler); // processor.ProcessEventsInOrder(); class RtcEventProcessor { … }; } // namespace webrtc #endif // LOGGING_RTC_EVENT_LOG_RTC_EVENT_PROCESSOR_H_