/*
 * Copyright 2017 The Cobalt Authors. All Rights Reserved.
 *
 * 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.
 */

#ifndef COBALT_BROWSER_MEMORY_SETTINGS_CONSTRAINER_H_
#define COBALT_BROWSER_MEMORY_SETTINGS_CONSTRAINER_H_

#include <string>
#include <vector>

#include "base/optional.h"
#include "cobalt/browser/memory_settings/memory_settings.h"
#include "starboard/types.h"

namespace cobalt {
namespace browser {
namespace memory_settings {

// Constrains the memory in the memmory_settings vector so that the target is
// such that the sum of memory consumption is below max_cpu_memory and
// max_gpu_memory.
//
// How the memory settings will reduce their memory usage is dependent on
// the ConstrainerFunction they contain. It's possible that the memory
// settings won't be able to match the target memory.
//
// The output variable error_msgs will be populated with any error messages
// that result from this function call.
void ConstrainToMemoryLimits(int64_t max_cpu_memory, int64_t max_gpu_memory,
                             std::vector<MemorySetting*>* memory_settings,
                             std::vector<std::string>* error_msgs);
}  // namespace memory_settings
}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_MEMORY_SETTINGS_CONSTRAINER_H_
