// // Copyright 2014 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. // #ifndef LIBANGLE_ATTRIBUTEMAP_H_ #define LIBANGLE_ATTRIBUTEMAP_H_ #include "common/FastVector.h" #include "common/PackedEnums.h" #include #include #include namespace egl { class Display; struct ValidationContext; // Validates {key, value} for each attribute. Generates an error and returns false on invalid usage. using AttributeValidationFunc = std::function; class AttributeMap final { public: static constexpr size_t kMapSize = 2; using Map = angle::FlatUnorderedMap; AttributeMap(); AttributeMap(const AttributeMap &other); AttributeMap &operator=(const AttributeMap &other); ~AttributeMap(); void insert(EGLAttrib key, EGLAttrib value); bool contains(EGLAttrib key) const; EGLAttrib get(EGLAttrib key) const; EGLAttrib get(EGLAttrib key, EGLAttrib defaultValue) const; EGLint getAsInt(EGLAttrib key) const; EGLint getAsInt(EGLAttrib key, EGLint defaultValue) const; template PackedEnumT getAsPackedEnum(EGLAttrib key) const { return FromEGLenum(static_cast(get(key))); } using const_iterator = Map::const_iterator; template PackedEnumT getAsPackedEnum(EGLAttrib key, PackedEnumT defaultValue) const { const_iterator iter = attribs().find(key); return (attribs().find(key) != attribs().end()) ? FromEGLenum(static_cast(iter->second)) : defaultValue; } bool isEmpty() const; std::vector toIntVector() const; const_iterator begin() const; const_iterator end() const; [[nodiscard]] bool validate(const ValidationContext *val, const egl::Display *display, AttributeValidationFunc validationFunc) const; // TODO: remove this and validate at every call site. http://anglebug.com/6671 void initializeWithoutValidation() const; static AttributeMap CreateFromIntArray(const EGLint *attributes); static AttributeMap CreateFromAttribArray(const EGLAttrib *attributes); private: bool isValidated() const; const Map &attribs() const { ASSERT(isValidated()); return mValidatedAttributes; } Map &attribs() { ASSERT(isValidated()); return mValidatedAttributes; } mutable const EGLint *mIntPointer = nullptr; mutable const EGLAttrib *mAttribPointer = nullptr; mutable Map mValidatedAttributes; }; } // namespace egl #endif // LIBANGLE_ATTRIBUTEMAP_H_