blob: e2d66bad9c4930420343f80d2f1f1f2aa4155d84 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_
#include <stdint.h>
#include "base/memory/raw_ptr_exclusion.h"
namespace mojo {
namespace internal {
class ValidationContext;
using ValidateEnumFunc = bool(int32_t, ValidationContext*);
// !!! Do not construct directly. Use the Get*Validator() helpers below !!!
class ContainerValidateParams {
public:
// If |expected_num_elements| is not 0, the array is expected to have exactly
// that number of elements.
uint32_t expected_num_elements = 0;
// Whether the elements are nullable.
bool element_is_nullable = false;
// Validation information for the map key array. May contain other
// ArrayValidateParams e.g. if the keys are strings.
//
// `key_validate_params` is not a raw_ptr<...> for performance reasons:
// when non-null, the pointer always refers to a statically-allocated
// constexpr ContainerValidateParams that is never freed.
RAW_PTR_EXCLUSION const ContainerValidateParams* key_validate_params =
nullptr;
// For arrays: validation information for elements. It is either a pointer to
// another instance of ArrayValidateParams (if elements are arrays or maps),
// or nullptr.
//
// For maps: validation information for the whole value array. May contain
// other ArrayValidateParams e.g. if the values are arrays or maps.
//
// `element_validate_params` is not a raw_ptr<...> for performance reasons:
// when non-null, the pointer always refers to a statically-allocated
// constexpr ContainerValidateParams that is never freed.
RAW_PTR_EXCLUSION const ContainerValidateParams* element_validate_params =
nullptr;
// Validation function for enum elements.
ValidateEnumFunc* validate_enum_func = nullptr;
};
// !!! Do not use directly. Use the Get*Validator() helpers below !!!
//
// These templates define storage for various ContainerValidateParam instances.
// The actual storage is defined as an inline variable; this forces the linker
// to merge all instances instantiated with a given set of parameters, which
// helps greatly with binary size.
template <uint32_t expected_num_elements,
bool element_is_nullable,
const ContainerValidateParams* element_validate_params>
struct ArrayValidateParamsHolder {
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = expected_num_elements,
.element_is_nullable = element_is_nullable,
.key_validate_params = nullptr,
.element_validate_params = element_validate_params,
.validate_enum_func = nullptr,
};
};
template <uint32_t expected_num_elements,
bool element_is_nullable,
ValidateEnumFunc* validate_enum_func>
struct ArrayOfEnumsValidateParamsHolder {
static_assert(validate_enum_func);
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = expected_num_elements,
.element_is_nullable = element_is_nullable,
.key_validate_params = nullptr,
.element_validate_params = nullptr,
.validate_enum_func = validate_enum_func,
};
};
template <const ContainerValidateParams& key_validate_params,
const ContainerValidateParams& element_validate_params>
struct MapValidateParamsHolder {
static inline constexpr ContainerValidateParams kInstance = {
.expected_num_elements = 0,
.element_is_nullable = false,
.key_validate_params = &key_validate_params,
.element_validate_params = &element_validate_params,
.validate_enum_func = nullptr,
};
};
// Gets a validator for an array. If `expected_num_elements` is 0, size
// validation is skipped. `element_validate_params` may optionally be null, e.g.
// for an array of uint8_t, no nested validation of uint8_t is required.
template <uint32_t expected_num_elements,
bool element_is_nullable,
const ContainerValidateParams* element_validate_params>
constexpr const ContainerValidateParams& GetArrayValidator() {
return ArrayValidateParamsHolder<expected_num_elements, element_is_nullable,
element_validate_params>::kInstance;
}
// Gets a validator for an array of enums. If `expected_num_elements` is 0, size
// validation is skipped. `validate_enum_func` must not be null.',
template <uint32_t expected_num_elements,
bool element_is_nullable,
ValidateEnumFunc* validate_enum_func>
constexpr const ContainerValidateParams& GetArrayOfEnumsValidator() {
static_assert(validate_enum_func);
return ArrayOfEnumsValidateParamsHolder<expected_num_elements,
element_is_nullable,
validate_enum_func>::kInstance;
}
// Gets a validator for a map. Internally, a map is represented as an array of
// keys and an array of values.
template <const ContainerValidateParams& key_validate_params,
const ContainerValidateParams& element_validate_params>
constexpr const ContainerValidateParams& GetMapValidator() {
return MapValidateParamsHolder<key_validate_params,
element_validate_params>::kInstance;
}
} // namespace internal
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATE_PARAMS_H_