blob: a10e68119fd0c3ceef63b160ec838a2fb48bf25d [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/public/common/feature_policy/policy_value.h"
#include "third_party/blink/public/mojom/feature_policy/policy_value.mojom.h"
namespace blink {
PolicyValue::PolicyValue() : type_(mojom::PolicyValueType::kNull) {}
// static
PolicyValue PolicyValue::CreateBool(bool value) {
return PolicyValue(value);
}
// static
PolicyValue PolicyValue::CreateDecDouble(double value) {
return PolicyValue(value, mojom::PolicyValueType::kDecDouble);
}
// static
PolicyValue PolicyValue::CreateEnum(int32_t value) {
return PolicyValue(value, mojom::PolicyValueType::kEnum);
}
PolicyValue::PolicyValue(bool bool_value)
: type_(mojom::PolicyValueType::kBool), bool_value_(bool_value) {}
PolicyValue::PolicyValue(double double_value, mojom::PolicyValueType type)
: type_(type), double_value_(double_value) {
DCHECK_EQ(type, mojom::PolicyValueType::kDecDouble);
}
PolicyValue::PolicyValue(int32_t int_value, mojom::PolicyValueType type)
: type_(type), int_value_(int_value) {
DCHECK_EQ(type, mojom::PolicyValueType::kEnum);
}
PolicyValue PolicyValue::CreateMaxPolicyValue(mojom::PolicyValueType type) {
PolicyValue value;
value.SetType(type);
value.SetToMax();
return value;
}
PolicyValue PolicyValue::CreateMinPolicyValue(mojom::PolicyValueType type) {
PolicyValue value;
value.SetType(type);
value.SetToMin();
return value;
}
bool PolicyValue::BoolValue() const {
DCHECK_EQ(type_, mojom::PolicyValueType::kBool);
return bool_value_;
}
double PolicyValue::DoubleValue() const {
DCHECK_EQ(type_, mojom::PolicyValueType::kDecDouble);
return double_value_;
}
int32_t PolicyValue::IntValue() const {
DCHECK_EQ(type_, mojom::PolicyValueType::kEnum);
return int_value_;
}
void PolicyValue::SetBoolValue(bool bool_value) {
DCHECK_EQ(mojom::PolicyValueType::kBool, type_);
bool_value_ = bool_value;
}
void PolicyValue::SetDoubleValue(double double_value) {
DCHECK_EQ(mojom::PolicyValueType::kDecDouble, type_);
double_value_ = double_value;
}
void PolicyValue::SetIntValue(int32_t int_value) {
DCHECK_EQ(mojom::PolicyValueType::kEnum, type_);
int_value_ = int_value;
}
PolicyValue& PolicyValue::operator=(const PolicyValue& rhs) {
if (this != &rhs) {
type_ = rhs.type_;
bool_value_ = rhs.bool_value_;
double_value_ = rhs.double_value_;
int_value_ = rhs.int_value_;
}
return *this;
}
bool operator==(const PolicyValue& lhs, const PolicyValue& rhs) {
if (lhs.Type() != rhs.Type())
return false;
switch (lhs.Type()) {
case mojom::PolicyValueType::kBool:
return lhs.BoolValue() == rhs.BoolValue();
case mojom::PolicyValueType::kDecDouble:
return lhs.DoubleValue() == rhs.DoubleValue();
case mojom::PolicyValueType::kEnum:
return lhs.IntValue() == rhs.IntValue();
case mojom::PolicyValueType::kNull:
return true;
}
NOTREACHED();
return false;
}
bool operator!=(const PolicyValue& lhs, const PolicyValue& rhs) {
return !(lhs == rhs);
}
bool PolicyValue::IsCompatibleWith(const PolicyValue& required) const {
DCHECK_EQ(type_, required.Type());
switch (type_) {
case mojom::PolicyValueType::kBool:
return !bool_value_ || required.bool_value_;
case mojom::PolicyValueType::kDecDouble:
return double_value_ <= required.double_value_;
case mojom::PolicyValueType::kEnum:
return int_value_ == required.int_value_;
case mojom::PolicyValueType::kNull:
NOTREACHED();
break;
}
return false;
}
void PolicyValue::SetToMax() {
switch (type_) {
case mojom::PolicyValueType::kBool:
bool_value_ = true;
break;
case mojom::PolicyValueType::kDecDouble:
double_value_ = std::numeric_limits<double>::infinity();
break;
default:
NOTREACHED();
}
return;
}
void PolicyValue::SetToMin() {
switch (type_) {
case mojom::PolicyValueType::kBool:
bool_value_ = false;
break;
case mojom::PolicyValueType::kDecDouble:
double_value_ = 0.0;
break;
default:
NOTREACHED();
}
return;
}
} // namespace blink