Image-CCV
view release on metacpan or search on metacpan
ccv-src/lib/ccv_internal.h view on Meta::CPAN
* a source language processor.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE. */
#ifndef INTERNAL_CATCH_UNIQUE_NAME_LINE2
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
#endif
#ifndef INTERNAL_CATCH_UNIQUE_NAME_LINE
#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
#endif
#ifndef INTERNAL_CATCH_UNIQUE_NAME
#define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
#endif
#define ccv_sign_with_literal(string) \
char INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_)[] = (string); \
size_t INTERNAL_CATCH_UNIQUE_NAME(_ccv_string_size_) = sizeof(INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_));
#define ccv_sign_with_format(size, string, ...) \
char INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_)[(size)]; \
memset(INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_), 0, (size)); \
snprintf(INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_), (size), (string), ##__VA_ARGS__); \
size_t INTERNAL_CATCH_UNIQUE_NAME(_ccv_string_size_) = (size);
#define CCV_EOF_SIGN ((uint64_t)0)
#define ccv_declare_derived_signature(var, cond, submacro, ...) \
submacro; \
uint64_t var = (cond) ? ccv_cache_generate_signature(INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_), INTERNAL_CATCH_UNIQUE_NAME(_ccv_string_size_), __VA_ARGS__) : 0;
/* the following macro enables more finer-control of ccv_declare_derived_signature, notably, it supports much more complex conditions:
* ccv_declare_derived_signature_case(sig,
* ccv_sign_with_format(64, "function_name(%f,%f,%f)", a_parameter, b_parameter, c_parameter),
* ccv_sign_if(% the first custom condition %, a->sig, 0),
* ccv_sign_if(% the second custom condition %, a->sig, b->sig, 0), ...)
* the conditions will pass on, thus, there is no early termination, if the last condition meets, the signature will be determined
* by the operation associated with the last condition */
#define ccv_sign_if(cond, ...) \
if (cond) { \
INTERNAL_CATCH_UNIQUE_NAME(_ccv_temp_sig_) = ccv_cache_generate_signature(INTERNAL_CATCH_UNIQUE_NAME(_ccv_identifier_), INTERNAL_CATCH_UNIQUE_NAME(_ccv_string_size_), __VA_ARGS__); \
}
#define INTERNAL_EXPAND_MACRO_ARGUMENT_TO_LINE_N(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_5...
_1;_2;_3;_4;_5;_6;_7;_8;_9;_10;_11;_12;_13;_14;_15;_16;_17;_18;_19;_20;_21;_22;_23;_24;_25;_26;_27;_28;_29;_30;_31;_32;_33;_34;_35;_36;_37;_38;_39;_40;_41;_42;_43;_44;_45;_46;_47;_48;_49;_50;_51;_52;_53;_54;_55;_56;_57;_58;_59;_60;_61;_62;_63
#define INTERNAL_EXPAND_MACRO_ARGUMENT_TO_LINE(...) INTERNAL_EXPAND_MACRO_ARGUMENT_TO_LINE_N(__VA_ARGS__)
#define INTERNAL_SEQ_PADDING_LINE() ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#define ccv_declare_derived_signature_case(var, submacro, ...) \
submacro; \
uint64_t INTERNAL_CATCH_UNIQUE_NAME(_ccv_temp_sig_) = 0; \
INTERNAL_EXPAND_MACRO_ARGUMENT_TO_LINE(__VA_ARGS__, INTERNAL_SEQ_PADDING_LINE()); \
uint64_t var = INTERNAL_CATCH_UNIQUE_NAME(_ccv_temp_sig_);
/* the macros enable us to preserve state of the program at any point in a structure way, this is borrowed from coroutine idea */
#define ccv_function_state_reserve_field int line_no;
#define ccv_function_state_begin(reader, s, file) (reader)((file), &(s)); switch ((s).line_no) { case 0:;
#define ccv_function_state_resume(writer, s, file) do { (s).line_no = __LINE__; (writer)(&(s), (file)); case __LINE__:; } while (0)
#define ccv_function_state_finish() }
/* the factor used to provide higher accuracy in integer type (all integer computation in some cases) */
#define _ccv_get_32s_value(ptr, i, factor) (((int*)(ptr))[(i)] << factor)
#define _ccv_get_32f_value(ptr, i, factor) ((float*)(ptr))[(i)]
#define _ccv_get_64s_value(ptr, i, factor) (((int64_t*)(ptr))[(i)] << factor)
#define _ccv_get_64f_value(ptr, i, factor) ((double*)(ptr))[(i)]
#define _ccv_get_8u_value(ptr, i, factor) (((unsigned char*)(ptr))[(i)] << factor)
#define ccv_matrix_getter(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_32F: { block(__VA_ARGS__, _ccv_get_32f_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_64F: { block(__VA_ARGS__, _ccv_get_64f_value); break; } \
default: { block(__VA_ARGS__, _ccv_get_8u_value); } } }
#define ccv_matrix_getter_a(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_32F: { block(__VA_ARGS__, _ccv_get_32f_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_64F: { block(__VA_ARGS__, _ccv_get_64f_value); break; } \
default: { block(__VA_ARGS__, _ccv_get_8u_value); } } }
#define ccv_matrix_getter_b(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_32F: { block(__VA_ARGS__, _ccv_get_32f_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_64F: { block(__VA_ARGS__, _ccv_get_64f_value); break; } \
default: { block(__VA_ARGS__, _ccv_get_8u_value); } } }
#define ccv_matrix_getter_integer_only(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_8U: { block(__VA_ARGS__, _ccv_get_8u_value); break; } \
default: { assert((type & CCV_32S) || (type & CCV_64S) || (type & CCV_8U)); } } }
#define ccv_matrix_getter_integer_only_a(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_8U: { block(__VA_ARGS__, _ccv_get_8u_value); break; } \
default: { assert((type & CCV_32S) || (type & CCV_64S) || (type & CCV_8U)); } } }
#define ccv_matrix_getter_integer_only_b(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, _ccv_get_32s_value); break; } \
case CCV_64S: { block(__VA_ARGS__, _ccv_get_64s_value); break; } \
case CCV_8U: { block(__VA_ARGS__, _ccv_get_8u_value); break; } \
default: { assert((type & CCV_32S) || (type & CCV_64S) || (type & CCV_8U)); } } }
#define ccv_matrix_getter_float_only(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32F: { block(__VA_ARGS__, _ccv_get_32f_value); break; } \
case CCV_64F: { block(__VA_ARGS__, _ccv_get_64f_value); break; } \
default: { assert((type & CCV_32F) || (type & CCV_64F)); } } }
#define ccv_matrix_typeof(type, block, ...) { switch (CCV_GET_DATA_TYPE(type)) { \
case CCV_32S: { block(__VA_ARGS__, int); break; } \
case CCV_32F: { block(__VA_ARGS__, float); break; } \
( run in 0.944 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )