void ExtExclude(CParser& p, Index<String>& x) { Vector<String> e = ReadPatterns(p); Vector<int> remove; for(int i = 0; i < x.GetCount(); i++) for(int j = 0; j < e.GetCount(); j++) { if(PatternMatch(e[j], x[i])) { remove.Add(i); break; } } x.Remove(remove); }
Thread::~Thread() { Detach(); #ifdef CPU_BLACKFIN #ifdef PLATFORM_POSIX //the static destruction replacement pthread_t thid = pthread_self(); vm.Enter(); int id = threadsv.Find(thid); if(id >= 0) threadsv.Remove(id); vm.Leave(); #endif #endif }
void IndexTutorial() { /// .`Index` /// `Index` is the the foundation of all U++ associative operations and is one of defining /// features of U++. /// `Index` is a container very similar to the plain `Vector` (it is random access array of /// elements with fast addition at the end) with one additional feature - it is able to fast /// retrieve position of element with required value using `Find` method: Index<String> ndx; ndx.Add("alfa"); ndx.Add("beta"); ndx.Add("gamma"); ndx.Add("delta"); ndx.Add("kappa"); DUMP(ndx); DUMP(ndx.Find("beta")); /// If element is not present in `Index`, `Find` returns a negative value: DUMP(ndx.Find("something")); /// Any element can be replaced using `Set` method: ndx.Set(1, "alfa"); DUMP(ndx); /// If there are more elements with the same value, they can be iterated using `FindNext` /// method: int fi = ndx.Find("alfa"); while(fi >= 0) { DUMP(fi); fi = ndx.FindNext(fi); } /// `FindAdd` method retrieves position of element like `Find`, but if element is not /// present in `Index`, it is added: DUMP(ndx.FindAdd("one")); DUMP(ndx.FindAdd("two")); DUMP(ndx.FindAdd("three")); DUMP(ndx.FindAdd("two")); DUMP(ndx.FindAdd("three")); DUMP(ndx.FindAdd("one")); /// Removing elements from random access sequence tends to be expensive, that is why rather /// than remove, `Index` supports `Unlink` and `UnlinkKey` operations, which retain the /// element in `Index` but make it invisible for `Find` operation: ndx.Unlink(2); ndx.UnlinkKey("kappa"); DUMP(ndx.Find(ndx[2])); DUMP(ndx.Find("kappa")); /// You can test whether element at given position is unlinked using `IsUnlinked` method DUMP(ndx.IsUnlinked(1)); DUMP(ndx.IsUnlinked(2)); /// Unlinked positions can be reused by `Put` method: ndx.Put("foo"); DUMP(ndx); DUMP(ndx.Find("foo")); /// You can also remove all unlinked elements from `Index` using `Sweep` method: ndx.Sweep(); DUMP(ndx); /// Operations directly removing or inserting elements of Index are expensive, but /// available too: ndx.Remove(1); DUMP(ndx); /// ndx.RemoveKey("two"); DUMP(ndx); /// ndx.Insert(0, "insert"); DUMP(ndx); /// PickKeys operation allows you to obtain Vector of elements of Index in low /// constant time operation (while destroying source Index) Vector<String> d = ndx.PickKeys(); DUMP(d); /// Pick-assigning `Vector` to `Index` is supported as well: d[0] = "test"; ndx = pick(d); DUMP(ndx); /// }
void MakeBuild::SaveMakeFile(const String& fn, bool exporting) { BeginBuilding(false, true); VectorMap<String, String> bm = GetMethodVars(method); One<Host> host = CreateHost(false); One<Builder> b = CreateBuilder(~host); if(!b) return; const TargetMode& tm = GetTargetMode(); String makefile; Vector<String> uppdirs = GetUppDirs(); String uppout = exporting ? host->GetHostPath(GetVar("OUTPUT")) : "_out/"; String inclist; Index<String> allconfig = PackageConfig(GetIdeWorkspace(), 0, bm, mainconfigparam, *host, *b); bool win32 = allconfig.Find("WIN32") >= 0; Workspace wspc; wspc.Scan(GetMain(), allconfig.GetKeys()); for(int i = 1; i < wspc.GetCount(); i++) { Index<String> modconfig = PackageConfig(wspc, i, bm, mainconfigparam, *host, *b); for(int a = allconfig.GetCount(); --a >= 0;) if(modconfig.Find(allconfig[a]) < 0) allconfig.Remove(a); } if(!exporting) for(int i = 0; i < uppdirs.GetCount(); i++) { String srcdir = GetMakePath(AdjustMakePath(host->GetHostPath(AppendFileName(uppdirs[i], ""))), win32); makefile << "UPPDIR" << (i + 1) << " = " << srcdir << "\n"; inclist << " -I$(UPPDIR" << (i + 1) << ")"; } else inclist << "-I./"; Vector<String> includes = SplitDirs(bm.Get("INCLUDE","")); for(int i = 0; i < includes.GetCount(); i++) inclist << " -I" << includes[i]; makefile << "\n" "UPPOUT = " << (exporting ? "_out/" : GetMakePath(AdjustMakePath(host->GetHostPath(AppendFileName(uppout, ""))), win32)) << "\n" "CINC = " << inclist << "\n" "Macro = "; for(int i = 0; i < allconfig.GetCount(); i++) makefile << " -Dflag" << allconfig[i]; makefile << "\n"; String output, config, install, rules, linkdep, linkfiles, linkfileend; for(int i = 0; i < wspc.GetCount(); i++) { b->config = PackageConfig(wspc, i, bm, mainconfigparam, *host, *b); b->version = tm.version; b->method = method; MakeFile mf; b->AddMakeFile(mf, wspc[i], GetAllUses(wspc, i), GetAllLibraries(wspc, i, bm, mainconfigparam, *host, *b), allconfig, exporting); if(!i) { String tdir = mf.outdir; String trg; if(tm.target_override) { trg = GetMakePath(AdjustMakePath(tm.target), win32); if(!trg.IsEmpty() && *trg.Last() == (win32 ? '\\' : '/')) trg << mf.outfile; else if(trg.Find(win32 ? '\\' : '/') < 0) trg.Insert(0, "$(OutDir)"); } output = Nvl(trg, mf.output); if(exporting) output = wspc[i] + ".out"; install << "\n" "OutDir = " << tdir << "\n" "OutFile = " << output << "\n" "\n" ".PHONY: all\n" "all: prepare $(OutFile)\n" "\n" ".PHONY: prepare\n" "prepare:\n"; } config << mf.config; install << mf.install; rules << mf.rules; linkdep << mf.linkdep; linkfiles << mf.linkfiles; linkfileend << mf.linkfileend; } makefile << config << install << "\n" "$(OutFile): " << linkdep << "\n\t" << linkfiles << linkfileend << " -Wl,--end-group\n\n" << rules << ".PHONY: clean\n" << "clean:\n" << "\tif [ -d $(UPPOUT) ]; then rm -rf $(UPPOUT); fi;\n"; bool sv = ::SaveFile(fn, makefile); if(!exporting) if(sv) PutConsole(NFormat("%s(1): makefile generation complete", fn)); else PutConsole(NFormat("%s: error writing makefile", fn)); EndBuilding(true); }
bool MakeBuild::Build(const Workspace& wspc, String mainparam, String outfile, bool clear_console) { String hfile = outfile + ".xxx"; SaveFile(hfile, ""); FileTime start_time = GetFileTime(hfile); // Defensive way to get correct filetime of start DeleteFile(hfile); ClearErrorEditor(); BeginBuilding(true, clear_console); bool ok = true; if(wspc.GetCount()) { for(int i = 0; i < wspc.GetCount(); i++) { const Package& pk = wspc.package[i]; for(int j = 0; j < pk.GetCount(); j++) if(pk[j] == "main.conf") { String pn = wspc[i]; String p = SourcePath(pn, "main.conf"); main_conf << "// " << pn << "\r\n" << LoadFile(p) << "\r\n"; PutConsole("Found " + p); } } if(main_conf.GetCount()) { VectorMap<String, String> bm = GetMethodVars(method); One<Host> host = CreateHost(false); One<Builder> b = CreateBuilder(~host); if(b) { Index<String> mcfg = PackageConfig(wspc, 0, bm, mainparam, *host, *b, NULL); String outdir = OutDir(mcfg, wspc[0], bm, false); String path = AppendFileName(outdir, "main.conf.h"); RealizePath(path); SaveChangedFile(path, main_conf); PutConsole("Saving " + path); add_includes << outdir << ';'; } } Vector<int> build_order; if(GetTargetMode().linkmode != 2) { for(int i = 1; i < wspc.GetCount(); i++) build_order.Add(i); } else { Index<int> remaining; for(int i = 1; i < wspc.GetCount(); i++) remaining.Add(i); while(!remaining.IsEmpty()) { int t; for(t = 0; t < remaining.GetCount(); t++) { const Package& pk = wspc.package[remaining[t]]; bool delay = false; for(int u = 0; u < pk.uses.GetCount(); u++) if(remaining.Find(wspc.package.Find(pk.uses[u].text)) >= 0) { delay = true; break; } if(!delay) break; } if(t >= remaining.GetCount()) t = 0; build_order.Add(remaining[t]); remaining.Remove(t); } } String mainpackage = wspc[0]; Vector<String> linkfile; String linkopt = GetMethodVars(method).Get(targetmode ? "RELEASE_LINK" : "DEBUG_LINK", Null); if(linkopt.GetCount()) linkopt << ' '; ok = true; int ms = msecs(); for(int i = 0; i < build_order.GetCount() && (ok || !stoponerrors); i++) { int px = build_order[i]; ok = BuildPackage(wspc, px, i, build_order.GetCount() + 1, mainparam, Null, linkfile, linkopt) && ok; if(msecs() - ms >= 200) { DoProcessEvents(); ms = msecs(); } } if(ok || !stoponerrors) { ok = BuildPackage(wspc, 0, build_order.GetCount(), build_order.GetCount() + 1, mainparam, outfile, linkfile, linkopt, ok) && ok; // Set the time of target to start-time, so that if any file changes during // compilation, it is recompiled during next build SetFileTime(target, start_time); } } EndBuilding(ok); ReQualifyCodeBase(); SetErrorEditor(); return ok; }