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