// // Copyright 2016 The ANGLE 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. // // Observer: // Implements the Observer pattern for sending state change notifications // from Subject objects to dependent Observer objects. // // See design document: // https://docs.google.com/document/d/15Edfotqg6_l1skTEL8ADQudF_oIdNa7i8Po43k6jMd4/ #ifndef LIBANGLE_OBSERVER_H_ #define LIBANGLE_OBSERVER_H_ #include "common/FastVector.h" #include "common/angleutils.h" #include "libANGLE/Constants.h" namespace angle { template <typename HaystackT, typename NeedleT> bool IsInContainer(const HaystackT &haystack, const NeedleT &needle) { … } SubjectIndex; // Messages are used to distinguish different Subject events that get sent to a single Observer. // It could be possible to improve the handling by using different callback functions instead // of a single handler function. But in some cases we want to share a single binding between // Observer and Subject and handle different types of events. enum class SubjectMessage { … }; inline bool IsProgramUniformBlockBindingUpdatedMessage(SubjectMessage message) { … } inline SubjectMessage ProgramUniformBlockBindingUpdatedMessageFromIndex(uint32_t blockIndex) { … } inline uint32_t ProgramUniformBlockBindingUpdatedMessageToIndex(SubjectMessage message) { … } // The observing class inherits from this interface class. class ObserverInterface { … }; class ObserverBindingBase { … }; constexpr size_t kMaxFixedObservers = …; // Maintains a list of observer bindings. Sends update messages to the observer. class Subject : NonCopyable { … }; // Keeps a binding between a Subject and Observer, with a specific subject index. class ObserverBinding final : public ObserverBindingBase { … }; } // namespace angle #endif // LIBANGLE_OBSERVER_H_