HSV Gradient::interpolate(double x) const { if (colors_.isEmpty()) { return HSV(); } else if(MY_ISNAN(x)) { return nanColor_; } else if (x <= colors_.least()) { return *colors_.values().begin(); } else if (x >= colors_.greatest()) { ColorMap::ConstValueIterator iter = colors_.values().end(); --iter; return *iter; } else { ColorMap::ConstNodeIterator hi = colors_.lowerBound(x); ASSERT_forbid(hi == colors_.nodes().end()); // would have been found by x>=colors_.greatest() ASSERT_forbid(hi == colors_.nodes().begin()); // would have been found by x<=colors_.least() ColorMap::ConstNodeIterator lo = hi; --lo; double interpolant = (x - lo->key()) / (hi->key() - lo->key()); const HSV &c1 = lo->value(); const HSV &c2 = hi->value(); return HSV(c1.h() + interpolant * (c2.h()-c1.h()), c1.s() + interpolant * (c2.s()-c1.s()), c1.v() + interpolant * (c2.v()-c1.v()), c1.a() + interpolant * (c2.a()-c1.a())); } }
static bool sortBySizeAddress(const NoOperation::IndexInterval &a, const NoOperation::IndexInterval &b) { ASSERT_forbid(0==a.size()); // empty or overflow ASSERT_forbid(0==b.size()); // empty or overflow if (a.size() != b.size()) return a.size() > b.size(); // sort by decreasing size return a.least() < b.least(); // then increasing address }
FunctionCallGraph::Graph::EdgeIterator FunctionCallGraph::insertCall(const Graph::VertexIterator &source, const Graph::VertexIterator &target, EdgeType type, size_t edgeCount) { ASSERT_forbid(source == graph_.vertices().end()); ASSERT_forbid(target == graph_.vertices().end()); if (edgeCount) { for (Graph::EdgeIterator edge=source->outEdges().begin(); edge!=source->outEdges().end(); ++edge) { if (edge->target()==target && edge->value().type()==type) { edge->value().count_ += edgeCount; return edge; } } } return graph_.insertEdge(source, target, Edge(type)); }
void BinaryDebugger::attach(const std::vector<std::string> &exeNameAndArgs) { ASSERT_forbid(exeNameAndArgs.empty()); detach(); child_ = fork(); if (0==child_) { char **argv = new char*[exeNameAndArgs.size()+1]; for (size_t i=0; i<exeNameAndArgs.size(); ++i) argv[i] = strdup(exeNameAndArgs[i].c_str()); argv[exeNameAndArgs.size()] = NULL; if (-1 == ptrace(PTRACE_TRACEME, 0, 0, 0)) { std::cerr <<"BinaryDebugger::attach: ptrace_traceme failed: " <<strerror(errno) <<"\n"; exit(1); } execv(argv[0], argv); std::cerr <<"BinaryDebugger::attach: exec \"" <<StringUtility::cEscape(argv[0]) <<"\" failed: " <<strerror(errno) <<"\n"; exit(1); } howDetach_ = DETACH; waitForChild(); if (isTerminated()) throw std::runtime_error("BinaryDebugger::attach: subordinate " + howTerminated() + " before we gained control"); }
void WMemoryMap::updateRowGroupDataWidgets(RowGroup &rg, MemoryMap::NodeIterator mmNode) { ASSERT_require(mmNode != memoryMap_.nodes().end()); const AddressInterval &interval = mmNode->key(); ASSERT_forbid(interval.isEmpty()); ASSERT_require(rg.segmentVa == interval.least()); rg.wSplit->setHidden(!isEditable_ || rg.editingColumn==SplitColumn || !canSplit(rg, mmNode)); rg.wMerge->setHidden(!isEditable_ || rg.editingColumn==MergeColumn || !canMerge(rg, mmNode)); rg.wLeastVa->setText(StringUtility::addrToString(interval.least())); rg.wGreatestVa->setText(StringUtility::addrToString(interval.greatest())); if (interval.isWhole()) { rg.wSize->setText("whole"); // since size would overflow back to zero } else { rg.wSize->setText(StringUtility::addrToString(interval.size())); } const MemoryMap::Segment &segment = mmNode->value(); rg.wReadable->setChecked(0 != (segment.accessibility() & MemoryMap::READABLE)); rg.wWritable->setChecked(0 != (segment.accessibility() & MemoryMap::WRITABLE)); rg.wExecutable->setChecked(0 != (segment.accessibility() & MemoryMap::EXECUTABLE)); rg.wName->setText(StringUtility::cEscape(segment.name())); }
// Number of times a tag with the same name as the top-of-stack tag appears in the stack, not counting the top-of-stack. SAWYER_EXPORT size_t PodFormatter::nested() const { ASSERT_forbid(tagStack_.empty()); size_t count = 0; BOOST_FOREACH (const Tag::Ptr &tag, tagStack_) { if (tag->name() == tagStack_.back()->name()) ++count; } ASSERT_require(count>0); return count-1; // don't count top-of-stack }
SAWYER_EXPORT void PodFormatter::endTag(std::ostream &out, const Tag::Ptr &tag, const TagArgs &args) { ASSERT_forbid(tagStack_.empty()); ASSERT_require(tagStack_.back()==tag); tagStack_.pop_back(); if (tag->type() == DIVIDING) out <<(atBeginningOfLine_?"":"\n") <<"\n"; if (tag->name() == "list") { out <<"=back\n\n"; } else if (tag->name() == "prose" || tag->name() == "nonprose") { out <<"=back\n\n"; textModePop(); } }
void Demangler::insert(const std::string &mangledName, const std::string &demangledName) { ASSERT_forbid(mangledName.empty()); ASSERT_forbid(demangledName.empty()); nameMap_.insert(mangledName, demangledName); }