// Copyright 2021 The Dawn Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "dawn_wire/client/LimitsAndFeatures.h"

#include "common/Assert.h"
#include "dawn_wire/SupportedFeatures.h"

namespace dawn_wire::client {

    bool LimitsAndFeatures::GetLimits(WGPUSupportedLimits* limits) const {
        ASSERT(limits != nullptr);
        if (limits->nextInChain != nullptr) {
            return false;
        }
        *limits = mLimits;
        return true;
    }

    bool LimitsAndFeatures::HasFeature(WGPUFeatureName feature) const {
        return mFeatures.count(feature) != 0;
    }

    uint32_t LimitsAndFeatures::EnumerateFeatures(WGPUFeatureName* features) const {
        if (features != nullptr) {
            for (WGPUFeatureName f : mFeatures) {
                *features = f;
                ++features;
            }
        }
        return mFeatures.size();
    }

    void LimitsAndFeatures::SetLimits(const WGPUSupportedLimits* limits) {
        ASSERT(limits != nullptr);
        mLimits = *limits;
        mLimits.nextInChain = nullptr;
    }

    void LimitsAndFeatures::SetFeatures(const WGPUFeatureName* features, uint32_t featuresCount) {
        ASSERT(features != nullptr || featuresCount == 0);
        for (uint32_t i = 0; i < featuresCount; ++i) {
            // Filter out features that the server supports, but the client does not.
            // (Could be different versions)
            if (!IsFeatureSupported(features[i])) {
                continue;
            }
            mFeatures.insert(features[i]);
        }
    }

}  // namespace dawn_wire::client
