Type operator| ( const Type& t1, const Type& t2) { SimpleType *st1, *st2; TableType *tt1, *tt2; TupletType *nt1, *nt2; if ( (st1 = isSimpleType(t1)) && (st2 = isSimpleType(t2)) ) { return makeSimpleType( st1->nature()|st2->nature(), st1->variability()|st2->variability(), st1->computability()|st2->computability(), st1->vectorability()|st2->vectorability(), st1->boolean()|st2->boolean(), reunion(st1->getInterval(), st2->getInterval()) ); } else if ( (tt1 = isTableType(t1)) && (tt2 = isTableType(t2)) ) { return makeTableType( tt1->content() | tt2->content() ); } else if ( (nt1 = isTupletType(t1)) && (nt2 = isTupletType(t2)) ) { vector<Type> v; int n = min(nt1->arity(), nt2->arity()); for (int i=0; i<n; i++) { v.push_back( (*nt1)[i] | (*nt2)[i]); } return new TupletType( v ); } else { stringstream error; error << "Error : trying to combine incompatible types, " << t1 << " and " << t2 << endl; throw faustexception(error.str()); } }
void solve() { FILE *fin = fopen("input.in", "r"); FILE *fout = fopen("output.out", "w"); FILE *cur_file; Array_t set1, set2; if (fin) { int i, number_of_files, queries, k; char **files, tmp[2000]; char *line, *word, *operator; Map_t *map; map = initialize_map(NUMBER_OF_BUCKETS); /* Citeste nr de fisiere si retine intr-un vector de cuvinte * numele acestora */ fgets(tmp, 20, fin); sscanf(tmp, "%d", &number_of_files); files = (char**)malloc(number_of_files * sizeof(char*)); for (i = 0; i < number_of_files; i++) { fgets(tmp, 150, fin); /* Retine in "line" numele fisierului, fara CRLF-ul de la final */ line = strtok(tmp, "\r\n"); files[i] = (char*)malloc((sizeof(tmp) + 1) * sizeof(char)); strcpy(files[i], line); } /* Parcurge cuvintele din fiecare fisier si le adauga in map */ for (i = 0; i < number_of_files; i++) { cur_file = fopen(files[i], "r"); if (cur_file) { while (fscanf(cur_file, "%s", tmp) != EOF) { strip_word(tmp); put_doc(map, tmp, i); } fclose(cur_file); } else { printf("Eroare la deschiderea fisierului %s!\n", files[i]); } } /* Citeste numarul de interogari*/ fgets(tmp, 20, fin); sscanf(tmp, "%d", &queries); /* Proceseaza fiecare interogare, efectuand operatii pe * vectorii ce contin fisierele in care apar respectivele chei */ for (i = 0; i < queries; i++) { fgets(tmp, 2000, fin); /* Retine in "line" interogarea, fara CRLF-ul de la final */ line = strtok(tmp, "\r\n"); fprintf(fout, "%s:", line); word = strtok(line, " \n\r"); set1 = get_docs(map, word); operator = strtok(NULL, " \n\r"); while (operator) { word = strtok(NULL, " \n\r"); set2 = get_docs(map, word); if (strcmp(operator, "&") == 0) { set1 = intersection(set1, set2); } else { set1 = reunion(set1, set2); } operator = strtok(NULL, " \n\r"); } for (k = 0; k <= set1.n; k++) { fprintf(fout, " %d", set1.v[k]); } fprintf(fout, " \n"); } fclose(fin); fclose(fout); } else { printf("Eroare la deschiderea fisierului input.in!\n"); } }