17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#ifndef CPPTIMER_H
177c804472Sopenharmony_ci#define CPPTIMER_H
187c804472Sopenharmony_ci
197c804472Sopenharmony_ci#include <algorithm>
207c804472Sopenharmony_ci#include <chrono>
217c804472Sopenharmony_ci#include <functional>
227c804472Sopenharmony_ci#include <list>
237c804472Sopenharmony_ci#include <thread>
247c804472Sopenharmony_ci
257c804472Sopenharmony_ci#include "CallbackQueue.h"
267c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
277c804472Sopenharmony_ci
287c804472Sopenharmony_ciclass CppTimer {
297c804472Sopenharmony_cipublic:
307c804472Sopenharmony_ci    CppTimer() = delete;
317c804472Sopenharmony_ci    CppTimer& operator=(const CppTimer&) = delete;
327c804472Sopenharmony_ci    CppTimer(const CppTimer&) = delete;
337c804472Sopenharmony_ci
347c804472Sopenharmony_ci    ~CppTimer();
357c804472Sopenharmony_ci
367c804472Sopenharmony_ci    // Use callback functions and parameters to construct a timer. the timer is repeatedly executed by default.
377c804472Sopenharmony_ci    template <class Function, class... Args>
387c804472Sopenharmony_ci    explicit CppTimer(Function callback, Args... args) : interval(0), shotTimes(-1), isRunning(false)
397c804472Sopenharmony_ci    {
407c804472Sopenharmony_ci        functional = [callback, args...]() { return callback(args...); };
417c804472Sopenharmony_ci        threadId = std::this_thread::get_id();
427c804472Sopenharmony_ci        InitClock();
437c804472Sopenharmony_ci    }
447c804472Sopenharmony_ci
457c804472Sopenharmony_ci    // Use callback functions, parameters, and execution times to construct a timer.
467c804472Sopenharmony_ci    template <class Function, class... Args>
477c804472Sopenharmony_ci    CppTimer(Function callback, Args... args, int shotTimes) : interval(0), shotTimes(-1), isRunning(false)
487c804472Sopenharmony_ci    {
497c804472Sopenharmony_ci        functional = [callback, args...]() { return callback(args...); };
507c804472Sopenharmony_ci        this->shotTimes = shotTimes;
517c804472Sopenharmony_ci        threadId = std::this_thread::get_id();
527c804472Sopenharmony_ci        InitClock();
537c804472Sopenharmony_ci    }
547c804472Sopenharmony_ci
557c804472Sopenharmony_ci    inline void SetShotTimes(int timers)
567c804472Sopenharmony_ci    {
577c804472Sopenharmony_ci        shotTimes = timers;
587c804472Sopenharmony_ci    }
597c804472Sopenharmony_ci
607c804472Sopenharmony_ci    inline int GetShotTimes() const
617c804472Sopenharmony_ci    {
627c804472Sopenharmony_ci        return shotTimes;
637c804472Sopenharmony_ci    }
647c804472Sopenharmony_ci
657c804472Sopenharmony_ci    inline bool IsRunning() const
667c804472Sopenharmony_ci    {
677c804472Sopenharmony_ci        return isRunning;
687c804472Sopenharmony_ci    }
697c804472Sopenharmony_ci
707c804472Sopenharmony_ci    void Start(int64_t value);
717c804472Sopenharmony_ci
727c804472Sopenharmony_ci    void Stop();
737c804472Sopenharmony_ci
747c804472Sopenharmony_ci    void RunTimerTick(CallbackQueue& queue);
757c804472Sopenharmony_ci
767c804472Sopenharmony_ciprivate:
777c804472Sopenharmony_ci    int64_t interval;
787c804472Sopenharmony_ci    int32_t shotTimes;
797c804472Sopenharmony_ci    std::thread::id threadId;
807c804472Sopenharmony_ci    bool isRunning;
817c804472Sopenharmony_ci    std::function<void()> functional;
827c804472Sopenharmony_ci    std::chrono::system_clock::time_point startTime;
837c804472Sopenharmony_ci
847c804472Sopenharmony_ci    void InitClock()
857c804472Sopenharmony_ci    {
867c804472Sopenharmony_ci        startTime = std::chrono::system_clock::now();
877c804472Sopenharmony_ci    }
887c804472Sopenharmony_ci};
897c804472Sopenharmony_ci
907c804472Sopenharmony_ci#endif // CPPTIMER_H
91