Skip to content

Commit

Permalink
Inverts tid_*_INT and tid_* declarations to enable switch statements …
Browse files Browse the repository at this point in the history
…on newer C++ compilers.
  • Loading branch information
tgregg committed Jul 10, 2018
1 parent db6ce03 commit e15eeba
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 119 deletions.
66 changes: 33 additions & 33 deletions ionc/inc/ion_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,44 +70,44 @@ typedef struct ion_type *ION_TYPE;
/** Current value type not known (has not been checked)
*
*/
#define tid_none ((ION_TYPE)(-0x200))
#define tid_none ((ION_TYPE)(tid_none_INT))

/** Stands for both End of File and End of Container, unfortunately.
*/
#define tid_EOF ((ION_TYPE)(-0x100))
#define tid_EOF ((ION_TYPE)(tid_EOF_INT))

/** Ion Value Type NULL.*/
#define tid_NULL ((ION_TYPE) 0x000)
#define tid_BOOL ((ION_TYPE) 0x100)
#define tid_INT ((ION_TYPE) 0x200)
#define tid_FLOAT ((ION_TYPE) 0x400)
#define tid_DECIMAL ((ION_TYPE) 0x500)
#define tid_TIMESTAMP ((ION_TYPE) 0x600)
#define tid_SYMBOL ((ION_TYPE) 0x700)
#define tid_STRING ((ION_TYPE) 0x800)
#define tid_CLOB ((ION_TYPE) 0x900)
#define tid_BLOB ((ION_TYPE) 0xA00)
#define tid_LIST ((ION_TYPE) 0xB00)
#define tid_SEXP ((ION_TYPE) 0xC00)
#define tid_STRUCT ((ION_TYPE) 0xD00)
#define tid_DATAGRAM ((ION_TYPE) 0xF00)

#define tid_none_INT ION_TYPE_INT(tid_none)
#define tid_EOF_INT ION_TYPE_INT(tid_EOF)
#define tid_NULL_INT ION_TYPE_INT(tid_NULL)
#define tid_BOOL_INT ION_TYPE_INT(tid_BOOL)
#define tid_INT_INT ION_TYPE_INT( tid_INT)
#define tid_FLOAT_INT ION_TYPE_INT(tid_FLOAT)
#define tid_DECIMAL_INT ION_TYPE_INT(tid_DECIMAL)
#define tid_TIMESTAMP_INT ION_TYPE_INT(tid_TIMESTAMP)
#define tid_SYMBOL_INT ION_TYPE_INT(tid_SYMBOL)
#define tid_STRING_INT ION_TYPE_INT(tid_STRING)
#define tid_CLOB_INT ION_TYPE_INT(tid_CLOB)
#define tid_BLOB_INT ION_TYPE_INT(tid_BLOB)
#define tid_STRUCT_INT ION_TYPE_INT(tid_STRUCT)
#define tid_LIST_INT ION_TYPE_INT(tid_LIST)
#define tid_SEXP_INT ION_TYPE_INT(tid_SEXP)
#define tid_DATAGRAM_INT ION_TYPE_INT(tid_DATAGRAM)
#define tid_NULL ((ION_TYPE) tid_NULL_INT)
#define tid_BOOL ((ION_TYPE) tid_BOOL_INT)
#define tid_INT ((ION_TYPE) tid_INT_INT)
#define tid_FLOAT ((ION_TYPE) tid_FLOAT_INT)
#define tid_DECIMAL ((ION_TYPE) tid_DECIMAL_INT)
#define tid_TIMESTAMP ((ION_TYPE) tid_TIMESTAMP_INT)
#define tid_SYMBOL ((ION_TYPE) tid_SYMBOL_INT)
#define tid_STRING ((ION_TYPE) tid_STRING_INT)
#define tid_CLOB ((ION_TYPE) tid_CLOB_INT)
#define tid_BLOB ((ION_TYPE) tid_BLOB_INT)
#define tid_LIST ((ION_TYPE) tid_LIST_INT)
#define tid_SEXP ((ION_TYPE) tid_SEXP_INT)
#define tid_STRUCT ((ION_TYPE) tid_STRUCT_INT)
#define tid_DATAGRAM ((ION_TYPE) tid_DATAGRAM_INT)

#define tid_none_INT -0x200
#define tid_EOF_INT -0x100
#define tid_NULL_INT 0x000
#define tid_BOOL_INT 0x100
#define tid_INT_INT 0x200
#define tid_FLOAT_INT 0x400
#define tid_DECIMAL_INT 0x500
#define tid_TIMESTAMP_INT 0x600
#define tid_SYMBOL_INT 0x700
#define tid_STRING_INT 0x800
#define tid_CLOB_INT 0x900
#define tid_BLOB_INT 0xA00
#define tid_LIST_INT 0xB00
#define tid_SEXP_INT 0xC00
#define tid_STRUCT_INT 0xD00
#define tid_DATAGRAM_INT 0xF00

typedef int32_t SID;
typedef int32_t SIZE;
Expand Down
31 changes: 14 additions & 17 deletions tools/events/ion_event_equivalence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,35 +55,33 @@ BOOL ion_compare_scalars(ION_EVENT_EQUIVALENCE_PARAMS) {
ION_PREPARE_COMPARISON;
void *expected_value = ION_EXPECTED_ARG->value;
void *actual_value = ION_ACTUAL_ARG->value;
int tid = ION_TID_INT(ION_EXPECTED_ARG->ion_type);
ION_EXPECT_FALSE((expected_value == NULL) ^ (actual_value == NULL), "Only one value was null.");
if (expected_value == NULL) {
// Equivalence of ion types has already been tested.
return TRUE;
}
switch (tid) {
case TID_BOOL:
switch (ION_TYPE_INT(ION_EXPECTED_ARG->ion_type)) {
case tid_BOOL_INT:
ION_EXPECT_BOOL_EQ((BOOL *)expected_value, (BOOL *)actual_value);
break;
case TID_POS_INT:
case TID_NEG_INT:
case tid_INT_INT:
ION_EXPECT_INT_EQ((ION_INT *)expected_value, (ION_INT *)actual_value);
break;
case TID_FLOAT:
case tid_FLOAT_INT:
ION_EXPECT_DOUBLE_EQ((double *)expected_value, (double *)actual_value);
break;
case TID_DECIMAL:
case tid_DECIMAL_INT:
ION_EXPECT_DECIMAL_EQ((ION_DECIMAL *)expected_value, (ION_DECIMAL *)actual_value);
break;
case TID_TIMESTAMP:
case tid_TIMESTAMP_INT:
ION_EXPECT_TIMESTAMP_EQ((ION_TIMESTAMP *)expected_value, (ION_TIMESTAMP *)actual_value);
break;
case TID_SYMBOL:
case tid_SYMBOL_INT:
ION_EXPECT_SYMBOL_EQ((ION_SYMBOL *)expected_value, (ION_SYMBOL *)actual_value);
break;
case TID_STRING:
case TID_CLOB:
case TID_BLOB: // Clobs and blobs are stored in ION_STRINGs too...
case tid_STRING_INT:
case tid_BLOB_INT:
case tid_CLOB_INT: // Clobs and blobs are stored in ION_STRINGs too...
ION_EXPECT_STRING_EQ((ION_STRING *)expected_value, (ION_STRING *)actual_value);
break;
default:
Expand Down Expand Up @@ -188,7 +186,6 @@ BOOL ion_compare_sequences(ION_EVENT_EQUIVALENCE_PARAMS) {
*/
BOOL ion_compare_events(ION_EVENT_EQUIVALENCE_PARAMS) {
ION_PREPARE_COMPARISON;
int tid = ION_TID_INT(ION_EXPECTED_ARG->ion_type);
ION_EXPECT_EVENT_TYPE_EQ(ION_EXPECTED_ARG->event_type, ION_ACTUAL_ARG->event_type);
ION_EXPECT_EQ(ION_EXPECTED_ARG->ion_type, ION_ACTUAL_ARG->ion_type, "Ion types did not match.");
ION_EXPECT_EQ(ION_EXPECTED_ARG->depth, ION_ACTUAL_ARG->depth, "Depths did not match.");
Expand All @@ -203,12 +200,12 @@ BOOL ion_compare_events(ION_EVENT_EQUIVALENCE_PARAMS) {
case CONTAINER_END:
break;
case CONTAINER_START:
switch (tid) {
case TID_STRUCT:
switch (ION_TYPE_INT(ION_EXPECTED_ARG->ion_type)) {
case tid_STRUCT_INT:
ION_CHECK_ASSERTION(ion_compare_structs(ION_EVENT_EQUIVALENCE_ARGS));
break;
case TID_SEXP: // intentional fall-through
case TID_LIST:
case tid_SEXP_INT: // intentional fall-through
case tid_LIST_INT:
ION_CHECK_ASSERTION(ion_compare_sequences(ION_EVENT_EQUIVALENCE_ARGS));
break;
default:
Expand Down
92 changes: 43 additions & 49 deletions tools/events/ion_event_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,20 @@ void ion_free_event_value(void *value, ION_TYPE ion_type, ION_EVENT_TYPE event_t
ion_free_owner(value);
}
else if (value) {
switch (ION_TID_INT(ion_type)) {
case TID_POS_INT:
case TID_NEG_INT:
switch (ION_TYPE_INT(ion_type)) {
case tid_INT_INT:
ion_int_free((ION_INT *)value);
break;
case TID_DECIMAL:
case tid_DECIMAL_INT:
ion_decimal_free((ION_DECIMAL *) value);
free(value);
break;
case TID_SYMBOL:
case tid_SYMBOL_INT:
ion_free_symbol((ION_SYMBOL *) value);
break;
case TID_STRING:
case TID_CLOB:
case TID_BLOB:
case tid_STRING_INT:
case tid_CLOB_INT:
case tid_BLOB_INT:
ion_free_string((ION_STRING *) value);
break;
default:
Expand Down Expand Up @@ -318,7 +317,6 @@ iERR ion_event_stream_read(hREADER hreader, IonEventStream *stream, ION_TYPE t,
IonEvent *event = NULL;
void *value = NULL;
BOOL is_scalar = TRUE;
int ion_type = ION_TID_INT(t);

if (in_struct) {
IONCREAD(ion_reader_get_field_name_symbol(hreader, &field_name));
Expand All @@ -332,7 +330,7 @@ iERR ion_event_stream_read(hREADER hreader, IonEventStream *stream, ION_TYPE t,

IONCREAD(ion_reader_is_null(hreader, &is_null));
if (is_embedded_stream_set) {
if (ion_type != TID_STRING) {
if (t != tid_STRING) {
IONFAILSTATE(IERR_INVALID_ARG, "Elements of embedded streams sets must be strings.");
}
IONREPORT(ion_event_stream_read_embedded_stream(hreader, stream, ION_RESULT_ARG));
Expand All @@ -343,13 +341,12 @@ iERR ion_event_stream_read(hREADER hreader, IonEventStream *stream, ION_TYPE t,
stream->appendNew(SCALAR, t, field_name, annotations, annotation_count, depth);
IONCLEANEXIT;
}
switch (ion_type) {
case TID_BOOL:
switch (ION_TYPE_INT(t)) {
case tid_BOOL_INT:
value = (BOOL *)malloc(sizeof(BOOL));
IONCREAD(ion_reader_read_bool(hreader, (BOOL *)value));
break;
case TID_POS_INT:
case TID_NEG_INT:
case tid_INT_INT:
{
ION_INT *ion_int_value = NULL;
// NOTE: owner must be NULL; otherwise, this may be unexpectedly freed.
Expand All @@ -358,36 +355,36 @@ iERR ion_event_stream_read(hREADER hreader, IonEventStream *stream, ION_TYPE t,
IONCREAD(ion_reader_read_ion_int(hreader, (ION_INT *)value));
break;
}
case TID_FLOAT:
case tid_FLOAT_INT:
value = (double *)malloc(sizeof(double));
IONCREAD(ion_reader_read_double(hreader, (double *)value));
break;
case TID_DECIMAL:
case tid_DECIMAL_INT:
value = (ION_DECIMAL *)malloc(sizeof(ION_DECIMAL));
IONCREAD(ion_reader_read_ion_decimal(hreader, (ION_DECIMAL *)value));
IONCREAD(ion_decimal_claim((ION_DECIMAL *)value));
break;
case TID_TIMESTAMP:
case tid_TIMESTAMP_INT:
value = (ION_TIMESTAMP *)malloc(sizeof(ION_TIMESTAMP));
IONCREAD(ion_reader_read_timestamp(hreader, (ION_TIMESTAMP *)value));
break;
case TID_SYMBOL:
case tid_SYMBOL_INT:
{
ION_SYMBOL tmp, *symbol_value;
IONCREAD(ion_reader_read_ion_symbol(hreader, &tmp));
ion_copy_symbol(&symbol_value, &tmp);
value = symbol_value;
break;
}
case TID_STRING:
case tid_STRING_INT:
{
ION_STRING string_value;
IONCREAD(ion_reader_read_string(hreader, &string_value));
value = ion_copy_string(&string_value);
break;
}
case TID_CLOB: // intentional fall-through
case TID_BLOB:
case tid_CLOB_INT: // intentional fall-through
case tid_BLOB_INT:
{
SIZE length, bytes_read;
IONCREAD(ion_reader_get_lob_size(hreader, &length));
Expand All @@ -405,13 +402,13 @@ iERR ion_event_stream_read(hREADER hreader, IonEventStream *stream, ION_TYPE t,
value = lob_value;
break;
}
case TID_SEXP: // intentional fall-through
case TID_LIST:
case tid_SEXP_INT: // intentional fall-through
case tid_LIST_INT:
is_embedded_stream_set = depth == 0 && annotation_count > 0
&& ION_STRING_EQUALS(&ion_event_embedded_streams_annotation,
&annotations[0].value);
// intentional fall-through
case TID_STRUCT:
case tid_STRUCT_INT:
is_scalar = FALSE;
stream->appendNew(CONTAINER_START, t, field_name, annotations, annotation_count, depth);
IONCREAD(ion_reader_step_in(hreader));
Expand Down Expand Up @@ -716,44 +713,43 @@ iERR ion_event_copy_value(IonEvent *event, void **value, ION_EVENT_COMMON_PARAMS
*value = NULL;
IONCLEANEXIT;
}
switch (ION_TID_INT(event->ion_type)) {
case TID_NULL:
switch (ION_TYPE_INT(event->ion_type)) {
case tid_NULL_INT:
break;
case TID_BOOL:
case tid_BOOL_INT:
bool_val = (BOOL *)malloc(sizeof(BOOL));
*bool_val = *(BOOL *)event->value;
*value = bool_val;
break;
case TID_POS_INT:
case TID_NEG_INT:
case tid_INT_INT:
// NOTE: owner must be NULL; otherwise, this may be unexpectedly freed.
IONCSTATE(ion_int_alloc(NULL, &int_val), "Failed to allocate a new ION_INT.");
*value = int_val;
IONCSTATE(ion_int_copy(int_val, (ION_INT *)event->value, int_val->_owner), "Failed to copy int value.");
break;
case TID_FLOAT:
case tid_FLOAT_INT:
float_val = (double *)malloc(sizeof(double));
*float_val = *(double *)event->value;
*value = float_val;
break;
case TID_DECIMAL:
case tid_DECIMAL_INT:
decimal = (ION_DECIMAL *)calloc(1, sizeof(ION_DECIMAL));
*value = decimal;
IONCSTATE(ion_decimal_copy(decimal, (ION_DECIMAL *)event->value), "Failed to copy decimal value.");
break;
case TID_TIMESTAMP:
case tid_TIMESTAMP_INT:
timestamp = (ION_TIMESTAMP *)malloc(sizeof(ION_TIMESTAMP));
// NOTE: this will not be this simple if ION_TIMESTAMP's fraction field is upgraded to use ION_DECIMAL.
memcpy(timestamp, (ION_TIMESTAMP *)event->value, sizeof(ION_TIMESTAMP));
*value = timestamp;
break;
case TID_SYMBOL:
case tid_SYMBOL_INT:
ion_copy_symbol(&symbol, (ION_SYMBOL *) event->value);
*value = symbol;
break;
case TID_STRING:
case TID_CLOB:
case TID_BLOB:
case tid_STRING_INT:
case tid_CLOB_INT:
case tid_BLOB_INT:
*value = ion_copy_string((ION_STRING *) event->value);
break;
default:
Expand Down Expand Up @@ -1130,43 +1126,41 @@ iERR ion_event_stream_read_all_from_bytes(const BYTE *ion_string, SIZE len, ION_
iERR ion_event_stream_write_scalar(hWRITER writer, IonEvent *event, ION_EVENT_INDEX_PARAMS) {
iENTER;
ION_SET_ERROR_CONTEXT(ION_LOCATION_ARG, ION_INDEX_ARG);
int tid = ION_TID_INT(event->ion_type);
if (!event->value) {
IONCWRITE(ion_writer_write_typed_null(writer, event->ion_type));
IONCLEANEXIT;
}
switch (tid) {
case TID_BOOL:
switch (ION_TYPE_INT(event->ion_type)) {
case tid_BOOL_INT:
IONCWRITE(ion_writer_write_bool(writer, *(BOOL *)event->value));
break;
case TID_POS_INT:
case TID_NEG_INT:
case tid_INT_INT:
IONCWRITE(ion_writer_write_ion_int(writer, (ION_INT *)event->value));
break;
case TID_FLOAT:
case tid_FLOAT_INT:
IONCWRITE(ion_writer_write_double(writer, *(double *)event->value));
break;
case TID_DECIMAL:
case tid_DECIMAL_INT:
IONCWRITE(ion_writer_write_ion_decimal(writer, (ION_DECIMAL *)event->value));
break;
case TID_TIMESTAMP:
case tid_TIMESTAMP_INT:
IONCWRITE(ion_writer_write_timestamp(writer, (ION_TIMESTAMP *)event->value));
break;
case TID_SYMBOL:
case tid_SYMBOL_INT:
IONCWRITE(ion_writer_write_ion_symbol(writer, (ION_SYMBOL *)event->value));
break;
case TID_STRING:
case tid_STRING_INT:
IONCWRITE(ion_writer_write_string(writer, (ION_STRING *)event->value));
break;
case TID_CLOB:
case tid_CLOB_INT:
IONCWRITE(ion_writer_write_clob(writer, ((ION_STRING *)event->value)->value,
((ION_STRING *)event->value)->length));
break;
case TID_BLOB:
case tid_BLOB_INT:
IONCWRITE(ion_writer_write_blob(writer, ((ION_STRING *)event->value)->value,
((ION_STRING *)event->value)->length));
break;
case TID_NULL: // NOTE: null events can only have NULL values; this is handled before the switch.
case tid_NULL_INT: // NOTE: null events can only have NULL values; this is handled before the switch.
default:
IONFAILSTATE(IERR_INVALID_ARG, "Invalid ion_type");
}
Expand Down
Loading

0 comments on commit e15eeba

Please sign in to comment.