13f4cbf05Sopenharmony_ci/*
23f4cbf05Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
33f4cbf05Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43f4cbf05Sopenharmony_ci * you may not use this file except in compliance with the License.
53f4cbf05Sopenharmony_ci * You may obtain a copy of the License at
63f4cbf05Sopenharmony_ci *
73f4cbf05Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83f4cbf05Sopenharmony_ci *
93f4cbf05Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103f4cbf05Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113f4cbf05Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123f4cbf05Sopenharmony_ci * See the License for the specific language governing permissions and
133f4cbf05Sopenharmony_ci * limitations under the License.
143f4cbf05Sopenharmony_ci */
153f4cbf05Sopenharmony_ci
163f4cbf05Sopenharmony_ci#include "observer.h"
173f4cbf05Sopenharmony_ci
183f4cbf05Sopenharmony_ciusing namespace std;
193f4cbf05Sopenharmony_ci
203f4cbf05Sopenharmony_cinamespace OHOS {
213f4cbf05Sopenharmony_ci
223f4cbf05Sopenharmony_civoid Observable::AddObserver(const shared_ptr<Observer>& o)
233f4cbf05Sopenharmony_ci{
243f4cbf05Sopenharmony_ci    if (o == nullptr) {
253f4cbf05Sopenharmony_ci        return;
263f4cbf05Sopenharmony_ci    }
273f4cbf05Sopenharmony_ci
283f4cbf05Sopenharmony_ci    lock_guard<mutex> lock(mutex_);
293f4cbf05Sopenharmony_ci    if (obs.count(o) > 0) {
303f4cbf05Sopenharmony_ci        return;
313f4cbf05Sopenharmony_ci    }
323f4cbf05Sopenharmony_ci
333f4cbf05Sopenharmony_ci    obs.insert(o);
343f4cbf05Sopenharmony_ci}
353f4cbf05Sopenharmony_ci
363f4cbf05Sopenharmony_civoid Observable::RemoveObserver(const shared_ptr<Observer>& o)
373f4cbf05Sopenharmony_ci{
383f4cbf05Sopenharmony_ci    lock_guard<mutex> lock(mutex_);
393f4cbf05Sopenharmony_ci    obs.erase(o);
403f4cbf05Sopenharmony_ci}
413f4cbf05Sopenharmony_ci
423f4cbf05Sopenharmony_civoid Observable::RemoveAllObservers()
433f4cbf05Sopenharmony_ci{
443f4cbf05Sopenharmony_ci    lock_guard<mutex> lock(mutex_);
453f4cbf05Sopenharmony_ci    obs.clear();
463f4cbf05Sopenharmony_ci}
473f4cbf05Sopenharmony_ci
483f4cbf05Sopenharmony_cibool Observable::HasChanged()
493f4cbf05Sopenharmony_ci{
503f4cbf05Sopenharmony_ci    return changed_;
513f4cbf05Sopenharmony_ci}
523f4cbf05Sopenharmony_ci
533f4cbf05Sopenharmony_ciint Observable::GetObserversCount()
543f4cbf05Sopenharmony_ci{
553f4cbf05Sopenharmony_ci    lock_guard<mutex> lock(mutex_);
563f4cbf05Sopenharmony_ci    return (int)obs.size();
573f4cbf05Sopenharmony_ci}
583f4cbf05Sopenharmony_ci
593f4cbf05Sopenharmony_civoid Observable::NotifyObservers()
603f4cbf05Sopenharmony_ci{
613f4cbf05Sopenharmony_ci    NotifyObservers(nullptr);
623f4cbf05Sopenharmony_ci}
633f4cbf05Sopenharmony_ci
643f4cbf05Sopenharmony_civoid Observable::NotifyObservers(const ObserverArg* arg)
653f4cbf05Sopenharmony_ci{
663f4cbf05Sopenharmony_ci    set<shared_ptr<Observer>> arrLocal;
673f4cbf05Sopenharmony_ci    {
683f4cbf05Sopenharmony_ci        lock_guard<mutex> lock(mutex_);
693f4cbf05Sopenharmony_ci        if (!changed_) {
703f4cbf05Sopenharmony_ci            return;
713f4cbf05Sopenharmony_ci        }
723f4cbf05Sopenharmony_ci
733f4cbf05Sopenharmony_ci        arrLocal = obs;
743f4cbf05Sopenharmony_ci        ClearChanged();
753f4cbf05Sopenharmony_ci    }
763f4cbf05Sopenharmony_ci
773f4cbf05Sopenharmony_ci    for (auto& o : arrLocal) {
783f4cbf05Sopenharmony_ci        o->Update(this, arg);
793f4cbf05Sopenharmony_ci    }
803f4cbf05Sopenharmony_ci}
813f4cbf05Sopenharmony_ci
823f4cbf05Sopenharmony_civoid Observable::SetChanged()
833f4cbf05Sopenharmony_ci{
843f4cbf05Sopenharmony_ci    changed_ = true;
853f4cbf05Sopenharmony_ci}
863f4cbf05Sopenharmony_ci
873f4cbf05Sopenharmony_civoid Observable::ClearChanged()
883f4cbf05Sopenharmony_ci{
893f4cbf05Sopenharmony_ci    changed_ = false;
903f4cbf05Sopenharmony_ci}
913f4cbf05Sopenharmony_ci
923f4cbf05Sopenharmony_ci}
93