tuple_type(type_id_t id, size_t size, const type *element_tp, bool variadic = false, uint32_t flags = type_flag_none) : base_type(id, 0, 1, flags | type_flag_indexable | (variadic ? type_flag_symbolic : 0), 0, 0, 0), m_field_count(size), m_field_types(size), m_arrmeta_offsets(size), m_variadic(variadic) { // Calculate the needed element alignment and arrmeta offsets size_t arrmeta_offset = get_field_count() * sizeof(size_t); this->m_data_alignment = 1; for (intptr_t i = 0; i < m_field_count; ++i) { m_field_types[i] = element_tp[i]; } for (intptr_t i = 0; i != m_field_count; ++i) { const type &ft = get_field_type(i); size_t field_alignment = ft.get_data_alignment(); // Accumulate the biggest field alignment as the type alignment if (field_alignment > this->m_data_alignment) { this->m_data_alignment = (uint8_t)field_alignment; } // Inherit any operand flags from the fields this->flags |= (ft.get_flags() & type_flags_operand_inherited); // Calculate the arrmeta offsets m_arrmeta_offsets[i] = arrmeta_offset; arrmeta_offset += ft.get_arrmeta_size(); } this->m_metadata_size = arrmeta_offset; }
/* ======================================================================================= ======================================================================================= */ bool shave_v17(HWND hDlg, int version, int line_count, int max_particles, FILE *fin, FILE *fout) { char line[2048]; int num_particles, num_to_keep, num_fields; int *keep_list, counter, written; unsigned int seed; memset(line, 0, sizeof(line)); if (!fgets(line, 32, fin)) { MessageBox(hDlg, "Error reading field count from list file.", "Error", MB_OK); return false; } num_fields = get_field_count(line); if (num_fields < 10) { MessageBox(hDlg, "Suspiciously low field count in list file. Not processing.", "Error", MB_OK); return false; } if (num_fields + 2 >= line_count) { MessageBox(hDlg, "More fields then lines in file. Not processing.", "Error", MB_OK); return false; } num_particles = line_count - (num_fields + 2); num_to_keep = max_particles; seed = GetDlgItemInt(hDlg, IDC_RAND_SEED, NULL, FALSE); if (seed == 0) { seed = 1; } keep_list = generate_keep_list(&num_to_keep, num_particles, seed); if (!keep_list) { MessageBox(hDlg, "Internal error allocating memory.", "Error", MB_OK); return false; } sprintf_s(line, sizeof(line), "%03d\nnum-fields|%d\n", version, num_fields); if (fputs(line, fout) < 0) { MessageBox(hDlg, "Error writing output file", "Error", MB_OK); return false; } // write out the fields for (int i = 0; i < num_fields; i++) { if (!fgets(line, sizeof(line), fin)) { if (ferror(fin)) { MessageBox(hDlg, "Error reading input file", "Error", MB_OK); return false; } } if (fputs(line, fout) < 0) { MessageBox(hDlg, "Error writing output file", "Error", MB_OK); return false; } } counter = 0; written = 0; while (!feof(fin)) { if (!fgets(line, sizeof(line), fin)) { if (ferror(fin)) { MessageBox(hDlg, "Error reading input file", "Error", MB_OK); return false; } } if (keep_list[counter++]) { if (fputs(line, fout) < 0) { MessageBox(hDlg, "Error writing output file", "Error", MB_OK); return false; } if (++written >= num_to_keep) { break; } } } delete [] keep_list; return true; }