8#ifndef INCLUDED_BDLAT_FUZZUTIL
9#define INCLUDED_BDLAT_FUZZUTIL
93#include <bslscm_version.h>
115#include <bsl_limits.h>
116#include <bsl_type_traits.h>
137 template <
class t_TYPE>
141 template <
class t_TYPE,
class t_INFO>
142 int operator()(t_TYPE *
object,
const t_INFO&);
162 template <
class t_TYPE,
class t_CATEGORY_TAG>
163 int operator()(t_TYPE *
object, t_CATEGORY_TAG);
177 template <
class t_TYPE, bdlat_TypeCategory::Value t_VALUE>
179 static_cast<bdlat_TypeCategory::Value>(
180 bdlat_TypeCategory::Select<t_TYPE>::e_SELECTION) == t_VALUE> {
187 template <
class t_ARRAY>
188 static typename EnableIf<t_ARRAY,
190 consume(t_ARRAY *
object,
193 template <
class t_CHOICE>
194 static typename EnableIf<t_CHOICE,
196 consume(t_CHOICE *
object,
199 template <
class t_CUSTOMIZED>
200 static typename EnableIf<t_CUSTOMIZED,
202 consume(t_CUSTOMIZED *
object,
205 template <
class t_DYNAMIC>
206 static typename EnableIf<t_DYNAMIC,
208 consume(t_DYNAMIC *
object,
211 template <
class t_ENUM>
212 static typename EnableIf<t_ENUM,
214 consume(t_ENUM *
object,
217 template <
class t_NULLABLE>
218 static typename EnableIf<t_NULLABLE,
220 consume(t_NULLABLE *
object,
223 template <
class t_SEQUENCE>
224 static typename EnableIf<t_SEQUENCE,
226 consume(t_SEQUENCE *
object,
229 template <
class t_SIMPLE>
230 static typename EnableIf<t_SIMPLE,
232 consume(t_SIMPLE *
object,
242 template<
class t_NUMBER>
246 consumeSimple(t_NUMBER *
object,
252 static void consumeSimple(
bool *
object,
306 template <
class t_MESSAGE>
309 template <
class t_MESSAGE>
324template <
class t_TYPE>
332template <
class t_TYPE,
class t_INFO>
336 return (*
this)(object);
344template <
class t_TYPE,
class t_CATEGORY_TAG>
358template <
class t_ARRAY>
360typename FuzzUtil::EnableIf<t_ARRAY,
362FuzzUtil::consume(t_ARRAY *
object,
368 const unsigned maxInt =
static_cast<unsigned>(
369 bsl::numeric_limits<int>::max());
370 if (maxSize > maxInt) {
373 unsigned newSize = bslim::FuzzUtil::consumeNumberInRange<unsigned>(
378 if (newSize != size) {
385 static_cast<int>(size));
390template <
class t_CHOICE>
392typename FuzzUtil::EnableIf<t_CHOICE,
394FuzzUtil::consume(t_CHOICE *
object,
396 const FuzzUtilOptions *options)
399 int selectionIndex = bslim::FuzzUtil::consumeNumberInRange<int>(
402 t_CHOICE::NUM_SELECTIONS - 1);
403 int selectionId = t_CHOICE::SELECTION_INFO_ARRAY[selectionIndex].id();
404 if (object->makeSelection(selectionId) == 0) {
406 object->manipulateSelection(manipulator);
410template <
class t_CUSTOMIZED>
412typename FuzzUtil::EnableIf<t_CUSTOMIZED,
414FuzzUtil::consume(t_CUSTOMIZED *
object,
416 const FuzzUtilOptions *options)
422template <
class t_DYNAMIC>
424typename FuzzUtil::EnableIf<t_DYNAMIC,
426FuzzUtil::consume(t_DYNAMIC *
object,
428 const FuzzUtilOptions *options)
434template <
class t_ENUM>
436typename FuzzUtil::EnableIf<t_ENUM,
438FuzzUtil::consume(t_ENUM *
object,
440 const FuzzUtilOptions *)
444 int index = bslim::FuzzUtil::consumeNumberInRange<int>(
447 Wrapper::NUM_ENUMERATORS - 1);
448 int intValue = Wrapper::ENUMERATOR_INFO_ARRAY[index].value();
449 Wrapper::fromInt(
object, intValue);
452template <
class t_NULLABLE>
454typename FuzzUtil::EnableIf<t_NULLABLE,
456FuzzUtil::consume(t_NULLABLE *
object,
458 const FuzzUtilOptions *options)
468template <
class t_SEQUENCE>
470typename FuzzUtil::EnableIf<t_SEQUENCE,
472FuzzUtil::consume(t_SEQUENCE *
object,
474 const FuzzUtilOptions *options)
480template <
class t_SIMPLE>
482typename FuzzUtil::EnableIf<t_SIMPLE,
484FuzzUtil::consume(t_SIMPLE *
object,
486 const FuzzUtilOptions *options)
488 consumeSimple(
object, fuzzData, options);
494 const FuzzUtilOptions *options)
496 consumeSimple(
object, fuzzData, options);
499template<
class t_NUMBER>
504FuzzUtil::consumeSimple(t_NUMBER *number,
506 const FuzzUtilOptions *)
508 *number = bslim::FuzzUtil::consumeNumber<t_NUMBER>(fuzzData);
514 const FuzzUtilOptions *)
517 bslim::FuzzUtil::consumeNumber<double>(fuzzData));
521void FuzzUtil::consumeSimple(
bool *
boolean,
523 const FuzzUtilOptions *)
531 const FuzzUtilOptions *options)
533 unsigned maxLen = options ? options->maxStringLength()
535 bool asciiOnly = options
536 ? options->printableAsciiCharsOnly()
551 const FuzzUtilOptions *options)
553 unsigned maxLen = options ? options->maxStringLength()
561 const FuzzUtilOptions *)
569 const FuzzUtilOptions *)
577 const FuzzUtilOptions *)
585 const FuzzUtilOptions *)
593 const FuzzUtilOptions *)
601 const FuzzUtilOptions *)
607template <
class t_MESSAGE>
611 consume(message, fuzzData, 0);
614template <
class t_MESSAGE>
619 consume(message, fuzzData, &options);
Definition bdlat_fuzzutiloptions.h:67
static const bool k_PRINTABLE_ASCII_CHARS_ONLY_DEFAULT
Definition bdlat_fuzzutiloptions.h:79
static const unsigned k_MAX_STRING_LENGTH_DEFAULT
Definition bdlat_fuzzutiloptions.h:78
static const unsigned k_MAX_ARRAY_LENGTH_DEFAULT
Default values.
Definition bdlat_fuzzutiloptions.h:77
unsigned maxArrayLength() const
Return the maximum array length.
Definition bdlat_fuzzutiloptions.h:158
Definition bdlat_fuzzutil.h:175
static void consumeMessage(t_MESSAGE *message, bslim::FuzzDataView *fuzzData)
Definition bdlat_fuzzutil.h:608
friend struct FuzzUtil_ManipulatorWithCategory
Definition bdlat_fuzzutil.h:282
friend struct FuzzUtil_Manipulator
Definition bdlat_fuzzutil.h:281
Definition bdldfp_decimal.h:1890
Definition bdlt_datetz.h:161
Definition bdlt_date.h:294
Definition bdlt_datetimetz.h:308
Definition bdlt_datetime.h:330
Definition bdlt_timetz.h:190
Definition bdlt_time.h:195
Definition bslstl_string.h:1252
Definition bslstl_vector.h:1120
Definition bslim_fuzzdataview.h:130
static int manipulateByCategory(TYPE *object, MANIPULATOR &manipulator)
Definition bdlat_typecategory.h:1414
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
int manipulateElement(TYPE *array, MANIPULATOR &manipulator, int index)
void resize(TYPE *array, int newSize)
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
int selectionId(const TYPE &object)
int createBaseAndConvert(t_TYPE *object, t_MANIPULATOR &baseManipulator)
int manipulateValue(TYPE *object, MANIPULATOR &manipulator)
void makeValue(TYPE *object)
int manipulateAttributes(TYPE *object, MANIPULATOR &manipulator)
Definition bdlat_arrayutil.h:198
Decimal_Type64 Decimal64
Definition bdldfp_decimal.h:750
Definition bdlat_fuzzutil.h:154
int operator()(t_TYPE *object, t_CATEGORY_TAG)
Call FuzzUtil::consume(object, fuzzData). Return 0.
Definition bdlat_fuzzutil.h:346
bslim::FuzzDataView * fuzzData
Definition bdlat_fuzzutil.h:156
const FuzzUtilOptions * options
Definition bdlat_fuzzutil.h:157
Definition bdlat_fuzzutil.h:129
int operator()(t_TYPE *object)
Call FuzzUtil::consume(object, fuzzData). Return 0.
Definition bdlat_fuzzutil.h:326
const FuzzUtilOptions * options
Definition bdlat_fuzzutil.h:132
bslim::FuzzDataView * fuzzData
Definition bdlat_fuzzutil.h:131
Definition bdlat_typetraits.h:155
This trait may be declared for "choice" types.
Definition bdlat_typetraits.h:111
This trait may be declared for "enumeration" types.
Definition bdlat_typetraits.h:123
@ e_ARRAY_CATEGORY
Definition bdlat_typecategory.h:1048
@ e_DYNAMIC_CATEGORY
Definition bdlat_typecategory.h:1047
@ e_CHOICE_CATEGORY
Definition bdlat_typecategory.h:1049
@ e_SEQUENCE_CATEGORY
Definition bdlat_typecategory.h:1053
@ e_SIMPLE_CATEGORY
Definition bdlat_typecategory.h:1054
@ e_CUSTOMIZED_TYPE_CATEGORY
Definition bdlat_typecategory.h:1050
@ e_NULLABLE_VALUE_CATEGORY
Definition bdlat_typecategory.h:1052
@ e_ENUMERATION_CATEGORY
Definition bdlat_typecategory.h:1051
static bdlt::Date consumeDate(bslim::FuzzDataView *fuzzDataView)
Definition bdlt_fuzzutil.h:235
static Time consumeTime(bslim::FuzzDataView *fuzzDataView)
static DatetimeTz consumeDatetimeTz(bslim::FuzzDataView *fuzzDataView)
static Datetime consumeDatetime(bslim::FuzzDataView *fuzzDataView)
static TimeTz consumeTimeTz(bslim::FuzzDataView *fuzzDataView)
static DateTz consumeDateTz(bslim::FuzzDataView *fuzzDataView)
Definition bslmf_enableif.h:530
Definition bslmf_isfloatingpoint.h:144
Definition bslmf_isintegral.h:140
static void consumeRandomLengthChars(bsl::vector< char > *output, FuzzDataView *fuzzDataView, bsl::size_t maxLength)
static void consumeRandomLengthAsciiString(bsl::string *output, FuzzDataView *fuzzDataView, bsl::size_t maxLength)
static bool consumeBool(FuzzDataView *fuzzDataView)
Definition bslim_fuzzutil.h:289
static void consumeRandomLengthString(bsl::string *output, FuzzDataView *fuzzDataView, bsl::size_t maxLength)