static void construct(Tp &r, Tp const &t, size_t offset, std::integral_constant<size_t, 0>, Ts&& ...args) { typedef typename std::remove_pointer< typename std::tuple_element<0, Tp>::type>::type current_type; auto ptr = advance_ptr(std::get<0>(t),offset); if (!std::has_trivial_default_constructor<current_type>::value) { new (ptr) current_type(std::forward<Ts>(args)...); // only the first type can be constructed by passing arguments } std::get<0>(r) = ptr; }
static void construct(Tp &r, Tp const &t, size_t offset, std::integral_constant<size_t, N>, Ts&& ...args) { typedef typename std::remove_pointer< typename std::tuple_element<N, Tp>::type>::type current_type; auto ptr = advance_ptr(std::get<N>(t),offset); if (!std::has_trivial_default_constructor<current_type>::value) { new (ptr) current_type; } std::get<N>(r) = ptr; construct(r, t, offset, std::integral_constant<size_t, N-1>(), std::forward<Ts>(args)...); }
void destroy(Tp &t, size_t s, std::integral_constant<size_t, 0>) { typedef typename std::remove_pointer< typename std::tuple_element<0, Tp>::type>::type current_type; #if __GNUC__ == 4 && __GNUC_MINOR__ <= 7 bool has_trivial_destructor = std::has_trivial_destructor<current_type>::value; #elif __GNUC__ == 4 && __GNUC_MINOR__ >= 8 bool has_trivial_destructor = std::is_trivially_destructible<current_type>::value; #endif if (!has_trivial_destructor) { for(size_t i=0; i < s; i++) advance_ptr(std::get<0>(t),i)->~current_type(); } delete []reinterpret_cast<char *>(std::get<0>(t)); }
int far pascal _loadds FS_READ( struct sffsi far *psffsi, struct sffsd far *psffsd, char far *pData, unsigned short far *pLen, unsigned short IOflag ) { int rc; kprintf("**** FS_READ\n"); filemax = psffsi->sfi_size; filepos = psffsi->sfi_position; kprintf("sfi_size = %lu, sfi_position = %lu\n", filemax, filepos); kprintf("buf = 0x%08lx, size = %u\n", pData, *pLen); if (*((unsigned long far *)psffsd + 1)) // direct read flag { if (!(rc = FSH_PROBEBUF(1, pData, *pLen))) { unsigned short cbSec = *pLen / secsize; if (rc = FSH_DOVOLIO(8, // return errors directly, don't use harderr daemon 1 + 2 + 4, // ABORT | RETRY | FAIL psffsi->sfi_hVPB, pData, &cbSec, filepos / secsize)) kprintf("FSH_DOVOLIO failed, rc = %u\n", rc); else { kprintf("FSH_DOVOLIO(buf = 0x%08lx, len = %u, start = %lu sectors) succeeded\n", pData, cbSec, filepos / secsize); *pLen = cbSec * secsize; kprintf("%u butes read\n", *pLen); filepos += *pLen; rc = NO_ERROR; } } else { kprintf("FS_READ: FSH_PROBEBUF failed!\n"); rc = 1; } } else { filebase = *((unsigned long far *)psffsd); advance_ptr(); if (rc = MFS_READ(pData, pLen)) { kprintf("MFS_READ failed, rc = %u\n", rc); } } psffsi->sfi_position = filepos; return rc; }
/* dump a preformatted range of a file */ static void dump_preformatted(const char *fname, int start, int n, int idx) { int i; char *p; int highlight = 0; long ofs1, ofs2; if (strcmp(fname, "-") == 0) { return; } if (strcmp(reg_matches.m[start].name[idx], reg_matches.m[start+n-1].name[idx]) != 0) { int base = start; for (i=start+1;i<start+n;i++) { if (strcmp(reg_matches.m[i-1].name[idx], reg_matches.m[i].name[idx]) != 0) { printf("<font color=green>%s:%d</font><p>\n", reg_matches.m[base].name[idx], reg_matches.m[base].line[idx]); dump_preformatted(reg_matches.m[i-1].name[idx], base, i-base, idx); base = i; } } printf("<font color=green>%s:%d</font><p>\n", reg_matches.m[base].name[idx], reg_matches.m[base].line[idx]); dump_preformatted(reg_matches.m[i-1].name[idx], base, i-base, idx); return; } p = load_file(fname); if (!p) return; ofs1 = reg_matches.m[start].ofs[idx]; ofs2 = reg_matches.m[start+n-1].ofs[idx] + reg_matches.m[start+n-1].len[idx]; /* move offsets to start of lines */ ofs1 = advance_ptr(p, ofs1, -1, 4); ofs2 = advance_ptr(p, ofs2, 1, 4); printf("<pre>\n"); for (i=ofs1;i<=ofs2;i++) { int in_range = check_range(i, start, n, idx); if (in_range && !highlight) { highlight = 1; printf("<font color=red>"); } if (!in_range && highlight) { highlight = 0; printf("</font>"); } if (p[i] == '<') { printf("<"); } else { putchar(p[i]); } } if (highlight) { printf("</font>"); } printf("</pre>\n"); free(p); }