Replace all oops() checks with ssassert()s.
This includes explanation and context for non-obvious cases and shortens debug cycles when just-in-time debugging is not available (like on Linux) by immediately printing description of the assert as well as symbolized backtrace.
This commit is contained in:
parent
4415f5bb91
commit
ad4a204edf
36
src/bsp.cpp
36
src/bsp.cpp
|
@ -39,7 +39,7 @@ SBsp3 *SBsp3::FromMesh(SMesh *m) {
|
|||
Vector SBsp3::IntersectionWith(Vector a, Vector b) {
|
||||
double da = a.Dot(n) - d;
|
||||
double db = b.Dot(n) - d;
|
||||
if(da*db > 0) oops();
|
||||
ssassert(da*db < 0, "Expected segment to intersect BSP node");
|
||||
|
||||
double dab = (db - da);
|
||||
return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab));
|
||||
|
@ -104,7 +104,7 @@ void SBsp3::InsertHow(int how, STriangle *tr, SMesh *instead) {
|
|||
more = m;
|
||||
break;
|
||||
}
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected BSP insert type");
|
||||
}
|
||||
return;
|
||||
|
||||
|
@ -144,7 +144,7 @@ void SBsp3::InsertConvexHow(int how, STriMeta meta, Vector *vertex, int n,
|
|||
}
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected BSP insert type");
|
||||
}
|
||||
int i;
|
||||
for(i = 0; i < n - 2; i++) {
|
||||
|
@ -234,7 +234,7 @@ SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, int cnt,
|
|||
inter[inters++] = vi;
|
||||
}
|
||||
}
|
||||
if(npos > cnt + 1 || nneg > cnt + 1) oops();
|
||||
if(npos > cnt + 1 || nneg > cnt + 1) ssassert(false, "Impossible");
|
||||
|
||||
if(!instead) {
|
||||
if(inters == 2) {
|
||||
|
@ -320,7 +320,7 @@ void SBsp3::Insert(STriangle *tr, SMesh *instead) {
|
|||
if (!isOn[0]) { a = tr->b; b = tr->c; }
|
||||
else if(!isOn[1]) { a = tr->c; b = tr->a; }
|
||||
else if(!isOn[2]) { a = tr->a; b = tr->b; }
|
||||
else oops();
|
||||
else ssassert(false, "Impossible");
|
||||
if(!instead) {
|
||||
SEdge se = SEdge::From(a, b);
|
||||
edges = SBsp2::InsertOrCreateEdge(edges, &se, n, tr->Normal());
|
||||
|
@ -344,7 +344,7 @@ void SBsp3::Insert(STriangle *tr, SMesh *instead) {
|
|||
if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1];
|
||||
} else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2];
|
||||
} else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0];
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
Vector bPc = IntersectionWith(b, c);
|
||||
STriangle btri = STriangle::From(tr->meta, a, b, bPc);
|
||||
|
@ -371,14 +371,14 @@ void SBsp3::Insert(STriangle *tr, SMesh *instead) {
|
|||
if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c;
|
||||
} else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a;
|
||||
} else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b;
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
} else if(posc == 1 && negc == 2) {
|
||||
if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c;
|
||||
} else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a;
|
||||
} else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b;
|
||||
} else oops();
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
Vector aPb = IntersectionWith(a, b);
|
||||
Vector cPa = IntersectionWith(c, a);
|
||||
|
@ -471,7 +471,7 @@ void SBsp3::DebugDraw(void) {
|
|||
Vector SBsp2::IntersectionWith(Vector a, Vector b) {
|
||||
double da = a.Dot(no) - d;
|
||||
double db = b.Dot(no) - d;
|
||||
if(da*db > 0) oops();
|
||||
ssassert(da*db < 0, "Expected segment to intersect BSP node");
|
||||
|
||||
double dab = (db - da);
|
||||
return (a.ScaledBy(db/dab)).Plus(b.ScaledBy(-da/dab));
|
||||
|
@ -547,7 +547,7 @@ void SBsp2::InsertEdge(SEdge *nedge, Vector nnp, Vector out) {
|
|||
}
|
||||
return;
|
||||
}
|
||||
oops();
|
||||
ssassert(false, "Impossible");
|
||||
}
|
||||
|
||||
void SBsp2::InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3) {
|
||||
|
@ -568,7 +568,7 @@ void SBsp2::InsertTriangleHow(int how, STriangle *tr, SMesh *m, SBsp3 *bsp3) {
|
|||
}
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected BSP insert type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -614,7 +614,7 @@ void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) {
|
|||
if (isOn[0]) { a = tr->a; b = tr->b; c = tr->c; bpos = isPos[1];
|
||||
} else if(isOn[1]) { a = tr->b; b = tr->c; c = tr->a; bpos = isPos[2];
|
||||
} else if(isOn[2]) { a = tr->c; b = tr->a; c = tr->b; bpos = isPos[0];
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
Vector bPc = IntersectionWith(b, c);
|
||||
STriangle btri = STriangle::From(tr->meta, a, b, bPc);
|
||||
|
@ -636,14 +636,14 @@ void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) {
|
|||
if (isNeg[0]) { a = tr->a; b = tr->b; c = tr->c;
|
||||
} else if(isNeg[1]) { a = tr->b; b = tr->c; c = tr->a;
|
||||
} else if(isNeg[2]) { a = tr->c; b = tr->a; c = tr->b;
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
} else if(posc == 1 && negc == 2) {
|
||||
if (isPos[0]) { a = tr->a; b = tr->b; c = tr->c;
|
||||
} else if(isPos[1]) { a = tr->b; b = tr->c; c = tr->a;
|
||||
} else if(isPos[2]) { a = tr->c; b = tr->a; c = tr->b;
|
||||
} else oops();
|
||||
} else oops();
|
||||
} else ssassert(false, "Impossible");
|
||||
} else ssassert(false, "Impossible");
|
||||
|
||||
Vector aPb = IntersectionWith(a, b);
|
||||
Vector cPa = IntersectionWith(c, a);
|
||||
|
@ -666,8 +666,8 @@ void SBsp2::InsertTriangle(STriangle *tr, SMesh *m, SBsp3 *bsp3) {
|
|||
}
|
||||
|
||||
void SBsp2::DebugDraw(Vector n, double d) {
|
||||
if(fabs((edge.a).Dot(n) - d) > LENGTH_EPS) oops();
|
||||
if(fabs((edge.b).Dot(n) - d) > LENGTH_EPS) oops();
|
||||
ssassert(fabs((edge.a).Dot(n) - d) < LENGTH_EPS, "Endpoint too close to BSP node plane");
|
||||
ssassert(fabs((edge.b).Dot(n) - d) < LENGTH_EPS, "Endpoint too close to BSP node plane");
|
||||
|
||||
ssglLineWidth(10);
|
||||
glBegin(GL_LINES);
|
||||
|
|
|
@ -42,7 +42,8 @@ hEntity SolveSpaceUI::Clipboard::NewEntityFor(hEntity he) {
|
|||
return cr->newReq.entity(1+i);
|
||||
}
|
||||
}
|
||||
oops();
|
||||
|
||||
ssassert(false, "Expected to find entity in some clipboard request");
|
||||
}
|
||||
|
||||
void GraphicsWindow::DeleteSelection(void) {
|
||||
|
@ -259,7 +260,7 @@ void GraphicsWindow::MenuClipboard(int id) {
|
|||
SS.GW.DeleteSelection();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -730,7 +730,7 @@ void Constraint::MenuConstrain(int id) {
|
|||
SS.ScheduleShowTW();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
|
||||
SS.GW.ClearSelection();
|
||||
|
|
|
@ -54,7 +54,7 @@ Expr *ConstraintBase::VectorsParallel(int eq, ExprVector a, ExprVector b) {
|
|||
|
||||
if(eq == 0) return e0;
|
||||
if(eq == 1) return e1;
|
||||
oops();
|
||||
ssassert(false, "Unexpected index of equation");
|
||||
}
|
||||
|
||||
Expr *ConstraintBase::PointLineDistance(hEntity wrkpl, hEntity hpt, hEntity hln)
|
||||
|
@ -104,7 +104,8 @@ Expr *ConstraintBase::PointPlaneDistance(ExprVector p, hEntity hpl) {
|
|||
Expr *ConstraintBase::Distance(hEntity wrkpl, hEntity hpa, hEntity hpb) {
|
||||
EntityBase *pa = SK.GetEntity(hpa);
|
||||
EntityBase *pb = SK.GetEntity(hpb);
|
||||
if(!(pa->IsPoint() && pb->IsPoint())) oops();
|
||||
ssassert(pa->IsPoint() && pb->IsPoint(),
|
||||
"Expected two points to measure projected distance between");
|
||||
|
||||
if(wrkpl.v == EntityBase::FREE_IN_3D.v) {
|
||||
// This is true distance
|
||||
|
@ -182,7 +183,7 @@ void ConstraintBase::ModifyToSatisfy(void) {
|
|||
IdList<Equation,hEquation> l = {};
|
||||
// Generate the equations even if this is a reference dimension
|
||||
GenerateReal(&l);
|
||||
if(l.n != 1) oops();
|
||||
ssassert(l.n == 1, "Expected constraint to generate a single equation");
|
||||
|
||||
// These equations are written in the form f(...) - d = 0, where
|
||||
// d is the value of the valA.
|
||||
|
@ -735,7 +736,7 @@ void ConstraintBase::GenerateReal(IdList<Equation,hEquation> *l) {
|
|||
dir[i] = e->CubicGetStartTangentExprs();
|
||||
}
|
||||
} else {
|
||||
oops();
|
||||
ssassert(false, "Unexpected entity types for CURVE_CURVE_TANGENT");
|
||||
}
|
||||
}
|
||||
if(parallel) {
|
||||
|
@ -788,7 +789,7 @@ void ConstraintBase::GenerateReal(IdList<Equation,hEquation> *l) {
|
|||
case COMMENT:
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected constraint ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -235,7 +235,7 @@ void TextWindow::DescribeSelection(void) {
|
|||
Printf(false, "%FtPOINT AND A CIRCLE");
|
||||
} else if(ec->type == Entity::ARC_OF_CIRCLE) {
|
||||
Printf(false, "%FtPOINT AND AN ARC");
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
Vector p = SK.GetEntity(gs.point[0])->PointGetNum();
|
||||
Printf(true, " pt at " PT_AS_STR, COSTR(p));
|
||||
Vector c = SK.GetEntity(ec->point[0])->PointGetNum();
|
||||
|
|
|
@ -305,7 +305,7 @@ void Constraint::DoEqualRadiusTicks(hEntity he) {
|
|||
double thetaa, thetab, dtheta;
|
||||
circ->ArcGetAngles(&thetaa, &thetab, &dtheta);
|
||||
theta = thetaa + dtheta/2;
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
|
||||
Vector d = u.ScaledBy(cos(theta)).Plus(v.ScaledBy(sin(theta)));
|
||||
d = d.ScaledBy(r);
|
||||
|
@ -1166,7 +1166,7 @@ s:
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected constraint type");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -180,7 +180,7 @@ BBox Entity::GetOrGenerateScreenBBox(bool *hasBBox) {
|
|||
screenBBox.Include(SS.GW.ProjectPoint3(sb->ctrl[i]));
|
||||
}
|
||||
}
|
||||
} else oops();
|
||||
} else ssassert(false, "Expected entity to be a point or have beziers");
|
||||
|
||||
// Enlarge the bounding box to consider selection radius.
|
||||
screenBBox.minp.x -= SELECTION_RADIUS;
|
||||
|
@ -286,7 +286,7 @@ void Entity::ComputeInterpolatingSpline(SBezierList *sbl, bool periodic) {
|
|||
|
||||
// The number of unknowns to solve for.
|
||||
int n = periodic ? 3 + ep : ep;
|
||||
if(n >= MAX_N) oops();
|
||||
ssassert(n < MAX_N, "Too many unknowns");
|
||||
// The number of on-curve points, one more than the number of segments.
|
||||
int pts = periodic ? 4 + ep : 2 + ep;
|
||||
|
||||
|
@ -708,8 +708,7 @@ void Entity::DrawOrGetDistance(void) {
|
|||
// Do nothing; these are drawn with the triangle mesh
|
||||
break;
|
||||
|
||||
default:
|
||||
oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
// And draw the curves; generate the rational polynomial curves for
|
||||
|
|
11
src/dsc.h
11
src/dsc.h
|
@ -222,7 +222,7 @@ public:
|
|||
}
|
||||
|
||||
void RemoveLast(int cnt) {
|
||||
if(n < cnt) oops();
|
||||
ssassert(n >= cnt, "Removing more elements than the list contains");
|
||||
for(int i = n - cnt; i < n; i++)
|
||||
elem[i].~T();
|
||||
n -= cnt;
|
||||
|
@ -281,13 +281,11 @@ public:
|
|||
while(first != last) {
|
||||
int mid = (first + last)/2;
|
||||
H hm = elem[mid].h;
|
||||
ssassert(hm.v != t->h.v, "Handle isn't unique");
|
||||
if(hm.v > t->h.v) {
|
||||
last = mid;
|
||||
} else if(hm.v < t->h.v) {
|
||||
first = mid + 1;
|
||||
} else {
|
||||
dbp("can't insert in list; is handle %d not unique?", t->h.v);
|
||||
oops();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -300,10 +298,7 @@ public:
|
|||
|
||||
T *FindById(H h) {
|
||||
T *t = FindByIdNoOops(h);
|
||||
if(!t) {
|
||||
dbp("failed to look up item %08x, searched %d items", h.v, n);
|
||||
oops();
|
||||
}
|
||||
ssassert(t != NULL, "Cannot find handle");
|
||||
return t;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ ExprVector EntityBase::VectorGetExprs(void) {
|
|||
case NORMAL_N_ROT_AA:
|
||||
return NormalExprsN();
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ Vector EntityBase::VectorGetNum(void) {
|
|||
case NORMAL_N_ROT_AA:
|
||||
return NormalN();
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,7 @@ Vector EntityBase::VectorGetRefPoint(void) {
|
|||
case NORMAL_N_ROT_AA:
|
||||
return SK.GetEntity(point[0])->PointGetNum();
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ Vector EntityBase::VectorGetStartPoint(void) {
|
|||
case NORMAL_N_ROT_AA:
|
||||
return SK.GetEntity(point[0])->PointGetNum();
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ Expr *EntityBase::CircleGetRadiusExpr(void) {
|
|||
return SK.GetEntity(distance)->DistanceGetExpr();
|
||||
} else if(type == ARC_OF_CIRCLE) {
|
||||
return Constraint::Distance(workplane, point[0], point[1]);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
double EntityBase::CircleGetRadiusNum(void) {
|
||||
|
@ -111,11 +111,11 @@ double EntityBase::CircleGetRadiusNum(void) {
|
|||
Vector c = SK.GetEntity(point[0])->PointGetNum();
|
||||
Vector pa = SK.GetEntity(point[1])->PointGetNum();
|
||||
return (pa.Minus(c)).Magnitude();
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
void EntityBase::ArcGetAngles(double *thetaa, double *thetab, double *dtheta) {
|
||||
if(type != ARC_OF_CIRCLE) oops();
|
||||
ssassert(type == ARC_OF_CIRCLE, "Unexpected entity type");
|
||||
|
||||
Quaternion q = Normal()->NormalGetNum();
|
||||
Vector u = q.RotationU(), v = q.RotationV();
|
||||
|
@ -185,9 +185,7 @@ void EntityBase::WorkplaneGetPlaneExprs(ExprVector *n, Expr **dn) {
|
|||
// n dot p - n dot p0 = 0
|
||||
// so dn = n dot p0
|
||||
*dn = p0.Dot(*n);
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
bool EntityBase::IsDistance(void) {
|
||||
|
@ -199,21 +197,21 @@ double EntityBase::DistanceGetNum(void) {
|
|||
return SK.GetParam(param[0])->val;
|
||||
} else if(type == DISTANCE_N_COPY) {
|
||||
return numDistance;
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
Expr *EntityBase::DistanceGetExpr(void) {
|
||||
if(type == DISTANCE) {
|
||||
return Expr::From(param[0]);
|
||||
} else if(type == DISTANCE_N_COPY) {
|
||||
return Expr::From(numDistance);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
void EntityBase::DistanceForceTo(double v) {
|
||||
if(type == DISTANCE) {
|
||||
(SK.GetParam(param[0]))->val = v;
|
||||
} else if(type == DISTANCE_N_COPY) {
|
||||
// do nothing, it's locked
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
EntityBase *EntityBase::Normal(void) {
|
||||
|
@ -276,7 +274,7 @@ Quaternion EntityBase::NormalGetNum(void) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
return q;
|
||||
}
|
||||
|
@ -308,7 +306,7 @@ void EntityBase::NormalForceTo(Quaternion q) {
|
|||
// Not sure if I'll bother implementing this one
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -364,7 +362,7 @@ ExprQuaternion EntityBase::NormalGetExprs(void) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
return q;
|
||||
}
|
||||
|
@ -428,7 +426,7 @@ void EntityBase::PointForceTo(Vector p) {
|
|||
// Nothing to do; it's a static copy
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -476,7 +474,7 @@ Vector EntityBase::PointGetNum(void) {
|
|||
p = numPoint;
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
@ -525,7 +523,7 @@ ExprVector EntityBase::PointGetExprs(void) {
|
|||
r = ExprVector::From(numPoint);
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
@ -553,7 +551,7 @@ void EntityBase::PointGetExprsInWorkplane(hEntity wrkpl, Expr **u, Expr **v) {
|
|||
}
|
||||
|
||||
void EntityBase::PointForceQuaternionTo(Quaternion q) {
|
||||
if(type != POINT_N_ROT_TRANS) oops();
|
||||
ssassert(type == POINT_N_ROT_TRANS, "Unexpected entity type");
|
||||
|
||||
SK.GetParam(param[3])->val = q.w;
|
||||
SK.GetParam(param[4])->val = q.vx;
|
||||
|
@ -592,7 +590,7 @@ Quaternion EntityBase::PointGetQuaternion(void) {
|
|||
q = GetAxisAngleQuaternion(3);
|
||||
} else if(type == POINT_N_ROT_TRANS) {
|
||||
q = Quaternion::From(param[3], param[4], param[5], param[6]);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
|
||||
return q;
|
||||
}
|
||||
|
@ -635,7 +633,7 @@ ExprVector EntityBase::FaceGetNormalExprs(void) {
|
|||
r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
||||
ExprQuaternion q = GetAxisAngleQuaternionExprs(3);
|
||||
r = q.Rotate(r);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -658,7 +656,7 @@ Vector EntityBase::FaceGetNormalNum(void) {
|
|||
r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz);
|
||||
Quaternion q = GetAxisAngleQuaternion(3);
|
||||
r = q.Rotate(r);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
return r.WithMagnitude(1);
|
||||
}
|
||||
|
||||
|
@ -687,7 +685,7 @@ ExprVector EntityBase::FaceGetPointExprs(void) {
|
|||
r = r.Minus(trans);
|
||||
r = q.Rotate(r);
|
||||
r = r.Plus(trans);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -712,7 +710,7 @@ Vector EntityBase::FaceGetPointNum(void) {
|
|||
r = numPoint.Minus(trans);
|
||||
r = q.Rotate(r);
|
||||
r = r.Plus(trans);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -728,9 +726,7 @@ Vector EntityBase::EndpointStart() {
|
|||
return CubicGetStartNum();
|
||||
} else if(type == ARC_OF_CIRCLE) {
|
||||
return SK.GetEntity(point[1])->PointGetNum();
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
Vector EntityBase::EndpointFinish() {
|
||||
if(type == LINE_SEGMENT) {
|
||||
|
@ -739,9 +735,7 @@ Vector EntityBase::EndpointFinish() {
|
|||
return CubicGetFinishNum();
|
||||
} else if(type == ARC_OF_CIRCLE) {
|
||||
return SK.GetEntity(point[2])->PointGetNum();
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
|
||||
void EntityBase::AddEq(IdList<Equation,hEquation> *l, Expr *expr, int index) {
|
||||
|
|
|
@ -895,7 +895,7 @@ void SolveSpaceUI::ExportMeshAsThreeJsTo(FILE *f, const std::string &filename,
|
|||
|
||||
std::string baseFilename = noExtFilename;
|
||||
size_t lastSlash = baseFilename.rfind(PATH_SEP);
|
||||
if(lastSlash == std::string::npos) oops();
|
||||
ssassert(lastSlash != std::string::npos, "Expected at least one path separator");
|
||||
baseFilename.erase(0, lastSlash + 1);
|
||||
|
||||
for(size_t i = 0; i < baseFilename.length(); i++) {
|
||||
|
|
|
@ -117,7 +117,7 @@ int StepFileWriter::ExportCurve(SBezier *sb) {
|
|||
}
|
||||
|
||||
int StepFileWriter::ExportCurveLoop(SBezierLoop *loop, bool inner) {
|
||||
if(loop->l.n < 1) oops();
|
||||
ssassert(loop->l.n >= 1, "Expected at least one loop");
|
||||
|
||||
List<int> listOfTrims = {};
|
||||
|
||||
|
|
|
@ -510,9 +510,7 @@ public:
|
|||
spline->knotslist.push_back(1.0);
|
||||
spline->knotslist.push_back(1.0);
|
||||
spline->knotslist.push_back(1.0);
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected degree of spline");
|
||||
}
|
||||
|
||||
void writeSpline(SBezier *sb) {
|
||||
|
@ -755,8 +753,7 @@ static std::string MakeStipplePattern(int pattern, double scale, char delimiter,
|
|||
result = ssprintf("%.3f_%.3f", scale * 2.0, scale * 0.5);
|
||||
break;
|
||||
|
||||
default:
|
||||
oops();
|
||||
default: ssassert(false, "Unexpected stipple pattern");
|
||||
}
|
||||
std::replace(result.begin(), result.end(), '_', delimiter);
|
||||
return result;
|
||||
|
|
24
src/expr.cpp
24
src/expr.cpp
|
@ -284,7 +284,7 @@ int Expr::Children(void) {
|
|||
case ACOS:
|
||||
return 1;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operation");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -293,7 +293,7 @@ int Expr::Nodes(void) {
|
|||
case 0: return 1;
|
||||
case 1: return 1 + a->Nodes();
|
||||
case 2: return 1 + a->Nodes() + b->Nodes();
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected children count");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -353,7 +353,7 @@ double Expr::Eval(void) {
|
|||
case ACOS: return acos(a->Eval());
|
||||
case ASIN: return asin(a->Eval());
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operation");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -396,7 +396,7 @@ Expr *Expr::PartialWrt(hParam p) {
|
|||
return (From(-1)->Div((From(1)->Minus(a->Square()))->Sqrt()))
|
||||
->Times(a->PartialWrt(p));
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operation");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -487,13 +487,13 @@ Expr *Expr::FoldConstants(void) {
|
|||
}
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operation");
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
void Expr::Substitute(hParam oldh, hParam newh) {
|
||||
if(op == PARAM_PTR) oops();
|
||||
ssassert(op != PARAM_PTR, "Expected an expression that refer to params via handles");
|
||||
|
||||
if(op == PARAM && parh.v == oldh.v) {
|
||||
parh = newh;
|
||||
|
@ -518,7 +518,7 @@ hParam Expr::ReferencedParams(ParamList *pl) {
|
|||
return NO_PARAMS;
|
||||
}
|
||||
}
|
||||
if(op == PARAM_PTR) oops();
|
||||
ssassert(op != PARAM_PTR, "Expected an expression that refer to params via handles");
|
||||
|
||||
int c = Children();
|
||||
if(c == 0) {
|
||||
|
@ -538,7 +538,7 @@ hParam Expr::ReferencedParams(ParamList *pl) {
|
|||
} else {
|
||||
return MULTIPLE_PARAMS;
|
||||
}
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected children count");
|
||||
}
|
||||
|
||||
|
||||
|
@ -571,7 +571,7 @@ p:
|
|||
case ASIN: return "(asin " + a->Print() + ")";
|
||||
case ACOS: return "(acos " + a->Print() + ")";
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operation");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -624,7 +624,7 @@ void Expr::Consume(void) {
|
|||
|
||||
int Expr::Precedence(Expr *e) {
|
||||
if(e->op == ALL_RESOLVED) return -1; // never want to reduce this marker
|
||||
if(e->op != BINARY_OP && e->op != UNARY_OP) oops();
|
||||
ssassert(e->op == BINARY_OP || e->op == UNARY_OP, "Unexpected operation");
|
||||
|
||||
switch(e->c) {
|
||||
case 'q':
|
||||
|
@ -638,7 +638,7 @@ int Expr::Precedence(Expr *e) {
|
|||
case '+':
|
||||
case '-': return 10;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operator");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -664,7 +664,7 @@ c:
|
|||
case 's': n = (PopOperand()->Times(Expr::From(PI/180)))->Sin(); break;
|
||||
case 'c': n = (PopOperand()->Times(Expr::From(PI/180)))->Cos(); break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected operator");
|
||||
}
|
||||
PushOperand(n);
|
||||
}
|
||||
|
|
24
src/file.cpp
24
src/file.cpp
|
@ -248,7 +248,7 @@ void SolveSpaceUI::SaveUsingTable(int type) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected value format");
|
||||
}
|
||||
fprintf(fh, "\n");
|
||||
}
|
||||
|
@ -415,7 +415,7 @@ void SolveSpaceUI::LoadUsingTable(char *key, char *val) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected value format");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -569,7 +569,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
&(tr.a.x), &(tr.a.y), &(tr.a.z),
|
||||
&(tr.b.x), &(tr.b.y), &(tr.b.z),
|
||||
&(tr.c.x), &(tr.c.y), &(tr.c.z)) != 11) {
|
||||
oops();
|
||||
ssassert(false, "Unexpected Triangle format");
|
||||
}
|
||||
tr.meta.color = RgbaColor::FromPackedInt((uint32_t)rgba);
|
||||
m->AddTriangle(&tr);
|
||||
|
@ -578,7 +578,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
if(sscanf(line, "Surface %x %x %x %d %d",
|
||||
&(srf.h.v), &rgba, &(srf.face),
|
||||
&(srf.degm), &(srf.degn)) != 5) {
|
||||
oops();
|
||||
ssassert(false, "Unexpected Surface format");
|
||||
}
|
||||
srf.color = RgbaColor::FromPackedInt((uint32_t)rgba);
|
||||
} else if(StrStartsWith(line, "SCtrl ")) {
|
||||
|
@ -588,7 +588,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
if(sscanf(line, "SCtrl %d %d %lf %lf %lf Weight %lf",
|
||||
&i, &j, &(c.x), &(c.y), &(c.z), &w) != 6)
|
||||
{
|
||||
oops();
|
||||
ssassert(false, "Unexpected SCtrl format");
|
||||
}
|
||||
srf.ctrl[i][j] = c;
|
||||
srf.weight[i][j] = w;
|
||||
|
@ -600,7 +600,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
&(stb.start.x), &(stb.start.y), &(stb.start.z),
|
||||
&(stb.finish.x), &(stb.finish.y), &(stb.finish.z)) != 8)
|
||||
{
|
||||
oops();
|
||||
ssassert(false, "Unexpected TrimBy format");
|
||||
}
|
||||
stb.backwards = (backwards != 0);
|
||||
srf.trim.Add(&stb);
|
||||
|
@ -615,7 +615,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
&(crv.exact.deg),
|
||||
&(crv.surfA.v), &(crv.surfB.v)) != 5)
|
||||
{
|
||||
oops();
|
||||
ssassert(false, "Unexpected Curve format");
|
||||
}
|
||||
crv.isExact = (isExact != 0);
|
||||
} else if(StrStartsWith(line, "CCtrl ")) {
|
||||
|
@ -625,7 +625,7 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
if(sscanf(line, "CCtrl %d %lf %lf %lf Weight %lf",
|
||||
&i, &(c.x), &(c.y), &(c.z), &w) != 5)
|
||||
{
|
||||
oops();
|
||||
ssassert(false, "Unexpected CCtrl format");
|
||||
}
|
||||
crv.exact.ctrl[i] = c;
|
||||
crv.exact.weight[i] = w;
|
||||
|
@ -636,16 +636,14 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const std::string &filename, EntityList
|
|||
&vertex,
|
||||
&(scpt.p.x), &(scpt.p.y), &(scpt.p.z)) != 4)
|
||||
{
|
||||
oops();
|
||||
ssassert(false, "Unexpected CurvePt format");
|
||||
}
|
||||
scpt.vertex = (vertex != 0);
|
||||
crv.pts.Add(&scpt);
|
||||
} else if(strcmp(line, "AddCurve")==0) {
|
||||
sh->curve.Add(&crv);
|
||||
crv = {};
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected operation");
|
||||
}
|
||||
|
||||
fclose(fh);
|
||||
|
@ -733,7 +731,7 @@ static std::string MakePathAbsolute(const std::string &base, const std::string &
|
|||
if(part == ".") {
|
||||
/* do nothing */
|
||||
} else if(part == "..") {
|
||||
if(resultParts.empty()) oops();
|
||||
ssassert(!resultParts.empty(), "Relative path pointing outside of root directory");
|
||||
resultParts.pop_back();
|
||||
} else {
|
||||
resultParts.push_back(part);
|
||||
|
|
|
@ -101,7 +101,7 @@ bool SolveSpaceUI::PruneRequests(hGroup hg) {
|
|||
|
||||
if(EntityExists(e->workplane)) continue;
|
||||
|
||||
if(!e->h.isFromRequest()) oops();
|
||||
ssassert(e->h.isFromRequest(), "Only explicitly created entities can be pruned");
|
||||
|
||||
(deleted.requests)++;
|
||||
SK.request.RemoveById(e->h.request());
|
||||
|
@ -199,7 +199,7 @@ void SolveSpaceUI::GenerateAll(GenerateType type, bool andFindFree, bool genForB
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected generation mode");
|
||||
}
|
||||
|
||||
// If we're generating entities for display, first we need to find
|
||||
|
|
|
@ -127,7 +127,7 @@ void ssglStippledLine(Vector a, Vector b, double width,
|
|||
case Style::STIPPLE_DOT: stipplePattern = "."; break;
|
||||
case Style::STIPPLE_FREEHAND: stipplePattern = "~"; break;
|
||||
case Style::STIPPLE_ZIGZAG: stipplePattern = "~__"; break;
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected stipple pattern");
|
||||
}
|
||||
ssglStippledLine(a, b, width, stipplePattern, stippleScale, maybeFat);
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ void ssglStippledLine(Vector a, Vector b, double width,
|
|||
void ssglStippledLine(Vector a, Vector b, double width,
|
||||
const char *stipplePattern, double stippleScale, bool maybeFat)
|
||||
{
|
||||
if(stipplePattern == NULL || *stipplePattern == 0) oops();
|
||||
ssassert(stipplePattern != NULL, "Unexpected stipple pattern");
|
||||
|
||||
Vector dir = b.Minus(a);
|
||||
double len = dir.Magnitude();
|
||||
|
@ -202,7 +202,7 @@ void ssglStippledLine(Vector a, Vector b, double width,
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected stipple pattern element");
|
||||
}
|
||||
if(*(++si) == 0) si = stipplePattern;
|
||||
} while(end > 0.0);
|
||||
|
|
|
@ -596,7 +596,7 @@ void GraphicsWindow::MenuView(int id) {
|
|||
SS.GW.EnsureValidActives();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
InvalidateGraphics();
|
||||
}
|
||||
|
@ -938,7 +938,7 @@ void GraphicsWindow::MenuEdit(int id) {
|
|||
SS.ScheduleShowTW();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1035,7 +1035,7 @@ c:
|
|||
SS.GW.SplitLinesOrCurves();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -241,7 +241,7 @@ void Group::MenuGroup(int id) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
|
||||
// Copy color from the previous mesh-contributing group.
|
||||
|
@ -287,7 +287,7 @@ void Group::MenuGroup(int id) {
|
|||
}
|
||||
|
||||
void Group::TransformImportedBy(Vector t, Quaternion q) {
|
||||
if(type != LINKED) oops();
|
||||
ssassert(type == LINKED, "Expected a linked group");
|
||||
|
||||
hParam tx, ty, tz, qw, qx, qy, qz;
|
||||
tx = h.param(0);
|
||||
|
@ -362,7 +362,7 @@ void Group::Generate(IdList<Entity,hEntity> *entity,
|
|||
} else if(subtype == WORKPLANE_BY_POINT_ORTHO) {
|
||||
// Already given, numerically.
|
||||
q = predef.q;
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected workplane subtype");
|
||||
|
||||
Entity normal = {};
|
||||
normal.type = Entity::NORMAL_N_COPY;
|
||||
|
@ -398,7 +398,7 @@ void Group::Generate(IdList<Entity,hEntity> *entity,
|
|||
ai = 0; af = 2;
|
||||
} else if(subtype == TWO_SIDED) {
|
||||
ai = -1; af = 1;
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected extrusion subtype");
|
||||
|
||||
// Get some arbitrary point in the sketch, that will be used
|
||||
// as a reference when defining top and bottom faces.
|
||||
|
@ -549,7 +549,7 @@ void Group::Generate(IdList<Entity,hEntity> *entity,
|
|||
}
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected group type");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -685,7 +685,7 @@ public:
|
|||
if(addPendingBlockEntity<DRW_Insert>(data)) return;
|
||||
|
||||
auto bi = blocks.find(data.name);
|
||||
if(bi == blocks.end()) oops();
|
||||
ssassert(bi != blocks.end(), "Inserted block does not exist");
|
||||
Block *block = &bi->second;
|
||||
|
||||
// Push transform.
|
||||
|
|
|
@ -229,7 +229,7 @@ default: dbp("bad constraint type %d", sc->type); return;
|
|||
ssys->result = SLVS_RESULT_TOO_MANY_UNKNOWNS;
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected solver result");
|
||||
}
|
||||
|
||||
// Write the new parameter values back to our caller.
|
||||
|
|
|
@ -1014,7 +1014,7 @@ void SKdNode::MakeCertainEdgesInto(SEdgeList *sel, int how, bool coplanarIsInter
|
|||
}
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected edge class");
|
||||
}
|
||||
|
||||
cnt++;
|
||||
|
|
|
@ -131,9 +131,7 @@ void GraphicsWindow::ParametricCurve::MakeFromEntity(hEntity he, bool reverse) {
|
|||
EntityBase *wrkpln = SK.GetEntity(e->workplane)->Normal();
|
||||
u = wrkpln->NormalU();
|
||||
v = wrkpln->NormalV();
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected entity type");
|
||||
}
|
||||
double GraphicsWindow::ParametricCurve::LengthForAuto(void) {
|
||||
if(isLine) {
|
||||
|
@ -518,7 +516,7 @@ hEntity GraphicsWindow::SplitCubic(hEntity he, Vector pinter) {
|
|||
int i, j;
|
||||
for(i = 0; i < sbl.l.n; i++) {
|
||||
SBezier *sb = &(sbl.l.elem[i]);
|
||||
if(sb->deg != 3) oops();
|
||||
ssassert(sb->deg == 3, "Expected a cubic bezier");
|
||||
|
||||
sb->ClosestPointTo(pinter, &t, false);
|
||||
if(pinter.Equals(sb->PointAt(t))) {
|
||||
|
|
|
@ -455,7 +455,7 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown,
|
|||
InvalidateGraphics();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected pending operation");
|
||||
}
|
||||
|
||||
if(pending.operation != 0 &&
|
||||
|
@ -590,7 +590,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) {
|
|||
Entity *e = SK.GetEntity(gs.entity[0]);
|
||||
e->GetDistance(Point2d::From(x, y));
|
||||
addAfterPoint = e->dogd.data;
|
||||
if(addAfterPoint == -1) oops();
|
||||
ssassert(addAfterPoint != -1, "Expected a nearest bezier point to be located");
|
||||
// Skip derivative point.
|
||||
if(r->type == Request::CUBIC) addAfterPoint++;
|
||||
AddContextMenuItem("Add Spline Point", CMNU_ADD_SPLINE_PT);
|
||||
|
@ -708,7 +708,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) {
|
|||
Request *r = SK.GetRequest(hr);
|
||||
|
||||
int index = r->IndexOfPoint(gs.point[0]);
|
||||
if(r->extraPoints == 0) oops();
|
||||
ssassert(r->extraPoints != 0, "Expected a bezier with interior control points");
|
||||
|
||||
SS.UndoRemember();
|
||||
Entity *e = SK.GetEntity(r->h.entity(0));
|
||||
|
|
|
@ -409,7 +409,7 @@ CONVERT(Rect)
|
|||
- (void)prepareEditorWithMinWidthInChars:(int)minWidthChars {
|
||||
NSFont *font = [editor font];
|
||||
NSGlyph glyphA = [font glyphWithName:@"a"];
|
||||
if(glyphA == -1) oops();
|
||||
ssassert(glyphA != -1, "Expected font to have U+0061");
|
||||
CGFloat glyphAWidth = [font advancementForGlyph:glyphA].width;
|
||||
|
||||
[editor sizeToFit];
|
||||
|
@ -578,7 +578,7 @@ void AddContextMenuItem(const char *label, int id_) {
|
|||
}
|
||||
|
||||
void CreateContextSubmenu(void) {
|
||||
if(contextSubmenu) oops();
|
||||
ssassert(!contextSubmenu, "Unexpected nested submenu");
|
||||
|
||||
contextSubmenu = [[NSMenu alloc] initWithTitle:@""];
|
||||
}
|
||||
|
@ -637,8 +637,8 @@ void InitMainMenu(NSMenu *mainMenu) {
|
|||
[menu setAutoenablesItems:NO];
|
||||
[menuItem setSubmenu:menu];
|
||||
|
||||
if(entry->level >= sizeof(levels) / sizeof(levels[0]))
|
||||
oops();
|
||||
ssassert((unsigned)entry->level < sizeof(levels) / sizeof(levels[0]),
|
||||
"Unexpected depth of menu nesting");
|
||||
|
||||
levels[entry->level] = menu;
|
||||
}
|
||||
|
@ -1145,7 +1145,7 @@ const void *SolveSpace::LoadResource(const std::string &name, size_t *size) {
|
|||
if(data == nil) {
|
||||
NSString *path = [[NSBundle mainBundle] pathForResource:key ofType:nil];
|
||||
data = [[NSFileHandle fileHandleForReadingAtPath:path] readDataToEndOfFile];
|
||||
if(data == nil) oops();
|
||||
ssassert(data != nil, "Cannot find resource");
|
||||
[cache setObject:data forKey:key];
|
||||
}
|
||||
|
||||
|
|
|
@ -14,12 +14,10 @@
|
|||
|
||||
GLOffscreen::GLOffscreen() : _pixels(NULL), _pixels_inv(NULL), _width(0), _height(0) {
|
||||
#ifndef __APPLE__
|
||||
if(glewInit() != GLEW_OK)
|
||||
oops();
|
||||
ssassert(glewInit() == GLEW_OK, "Unexpected GLEW failure");
|
||||
#endif
|
||||
|
||||
if(!GL_EXT_framebuffer_object)
|
||||
oops();
|
||||
ssassert(GL_EXT_framebuffer_object, "Expected an available FBO extension");
|
||||
|
||||
glGenFramebuffersEXT(1, &_framebuffer);
|
||||
glGenRenderbuffersEXT(1, &_color_renderbuffer);
|
||||
|
|
|
@ -243,15 +243,11 @@ public:
|
|||
_xdisplay = gdk_x11_get_default_xdisplay();
|
||||
|
||||
int glxmajor, glxminor;
|
||||
if(!glXQueryVersion(_xdisplay, &glxmajor, &glxminor)) {
|
||||
dbp("OpenGL is not supported");
|
||||
oops();
|
||||
}
|
||||
ssassert(glXQueryVersion(_xdisplay, &glxmajor, &glxminor),
|
||||
"Expected OpenGL to be available");
|
||||
|
||||
if(glxmajor < 1 || (glxmajor == 1 && glxminor < 3)) {
|
||||
dbp("GLX version %d.%d is too old; 1.3 required", glxmajor, glxminor);
|
||||
oops();
|
||||
}
|
||||
ssassert(glxmajor > 1 || (glxmajor == 1 && glxminor >= 3),
|
||||
"Expected GLX >= 1.3");
|
||||
|
||||
static int fbconfig_attrs[] = {
|
||||
GLX_RENDER_TYPE, GLX_RGBA_BIT,
|
||||
|
@ -264,8 +260,8 @@ public:
|
|||
int fbconfig_num = 0;
|
||||
GLXFBConfig *fbconfigs = glXChooseFBConfig(_xdisplay, DefaultScreen(_xdisplay),
|
||||
fbconfig_attrs, &fbconfig_num);
|
||||
if(!fbconfigs || fbconfig_num == 0)
|
||||
oops();
|
||||
ssassert(fbconfigs && fbconfig_num > 0,
|
||||
"Expected an available framebuffer configuration");
|
||||
|
||||
/* prefer FBConfigs with depth of 32;
|
||||
* Mesa software rasterizer explodes with a BadMatch without this;
|
||||
|
@ -291,10 +287,7 @@ public:
|
|||
|
||||
_glcontext = glXCreateNewContext(_xdisplay,
|
||||
fbconfig, GLX_RGBA_TYPE, 0, True);
|
||||
if(!_glcontext) {
|
||||
dbp("cannot create OpenGL context");
|
||||
oops();
|
||||
}
|
||||
ssassert(_glcontext != NULL, "Cannot create an OpenGL context");
|
||||
|
||||
XFree(fbconfigs);
|
||||
|
||||
|
@ -329,15 +322,15 @@ protected:
|
|||
bool on_expose_event(GdkEventExpose *) override {
|
||||
const Cairo::RefPtr<Cairo::Context> &cr = get_window()->create_cairo_context();
|
||||
#endif
|
||||
if(!glXMakeCurrent(_xdisplay, _xwindow, _glcontext))
|
||||
oops();
|
||||
ssassert(glXMakeCurrent(_xdisplay, _xwindow, _glcontext),
|
||||
"Cannot make OpenGL context current");
|
||||
|
||||
if(!_offscreen)
|
||||
_offscreen = new GLOffscreen;
|
||||
|
||||
Gdk::Rectangle allocation = get_allocation();
|
||||
if(!_offscreen->begin(allocation.get_width(), allocation.get_height()))
|
||||
oops();
|
||||
ssassert(_offscreen->begin(allocation.get_width(), allocation.get_height()),
|
||||
"Cannot allocate offscreen rendering buffer");
|
||||
|
||||
on_gl_draw();
|
||||
glFlush();
|
||||
|
@ -860,7 +853,7 @@ void AddContextMenuItem(const char *label, int id) {
|
|||
}
|
||||
|
||||
void CreateContextSubmenu(void) {
|
||||
if(context_submenu) oops();
|
||||
ssassert(!context_submenu, "Unexpected nested submenu");
|
||||
|
||||
context_submenu = new Gtk::Menu;
|
||||
}
|
||||
|
@ -969,8 +962,8 @@ static void InitMainMenu(Gtk::MenuShell *menu_shell) {
|
|||
Gtk::Menu *menu = new Gtk::Menu;
|
||||
menu_item->set_submenu(*menu);
|
||||
|
||||
if((unsigned)entry->level >= sizeof(levels) / sizeof(levels[0]))
|
||||
oops();
|
||||
ssassert((unsigned)entry->level < sizeof(levels) / sizeof(levels[0]),
|
||||
"Unexpected depth of menu nesting");
|
||||
|
||||
levels[entry->level] = menu;
|
||||
}
|
||||
|
@ -1144,8 +1137,7 @@ static void ChooserFilterChanged(Gtk::FileChooserDialog *chooser)
|
|||
int rdelim = filter_name.find(',', lparen);
|
||||
if(rdelim < 0)
|
||||
rdelim = filter_name.find(')', lparen);
|
||||
if(lparen < 0 || rdelim < 0)
|
||||
oops();
|
||||
ssassert(lparen > 0 && rdelim > 0, "Expected to find a parenthesized extension");
|
||||
|
||||
std::string extension = filter_name.substr(lparen, rdelim - lparen);
|
||||
if(extension == "*")
|
||||
|
@ -1506,14 +1498,14 @@ const void *LoadResource(const std::string &name, size_t *size) {
|
|||
|
||||
path = (UNIX_DATADIR "/") + name;
|
||||
if(stat(path.c_str(), &st)) {
|
||||
if(errno != ENOENT) oops();
|
||||
ssassert(errno == ENOENT, "Unexpected stat() error");
|
||||
path = resource_dir + "/" + name;
|
||||
if(stat(path.c_str(), &st)) oops();
|
||||
ssassert(!stat(path.c_str(), &st), "Cannot find resource");
|
||||
}
|
||||
|
||||
std::vector<uint8_t> data(st.st_size);
|
||||
FILE *f = ssfopen(path.c_str(), "rb");
|
||||
if(!f) oops();
|
||||
ssassert(f != NULL, "Cannot open resource");
|
||||
fread(&data[0], 1, st.st_size, f);
|
||||
fclose(f);
|
||||
|
||||
|
|
|
@ -51,13 +51,15 @@ void assert_failure(const char *file, unsigned line, const char *function,
|
|||
|
||||
FILE *ssfopen(const std::string &filename, const char *mode)
|
||||
{
|
||||
if(filename.length() != strlen(filename.c_str())) oops();
|
||||
ssassert(filename.length() == strlen(filename.c_str()),
|
||||
"Unexpected null byte in middle of a path");
|
||||
return fopen(filename.c_str(), mode);
|
||||
}
|
||||
|
||||
void ssremove(const std::string &filename)
|
||||
{
|
||||
if(filename.length() != strlen(filename.c_str())) oops();
|
||||
ssassert(filename.length() == strlen(filename.c_str()),
|
||||
"Unexpected null byte in middle of a path");
|
||||
remove(filename.c_str());
|
||||
}
|
||||
|
||||
|
@ -114,7 +116,7 @@ void FreeAllTemporary(void)
|
|||
|
||||
void *MemAlloc(size_t n) {
|
||||
void *p = malloc(n);
|
||||
if(!p) oops();
|
||||
ssassert(p != NULL, "Cannot allocate memory");
|
||||
return p;
|
||||
}
|
||||
|
||||
|
|
|
@ -744,9 +744,9 @@ static void CreateGlContext(HWND hwnd, HGLRC *glrc)
|
|||
pfd.cStencilBits = 0;
|
||||
|
||||
pixelFormat = ChoosePixelFormat(hdc, &pfd);
|
||||
if(!pixelFormat) oops();
|
||||
ssassert(pixelFormat != 0, "Expected a valid pixel format to be chosen");
|
||||
|
||||
if(!SetPixelFormat(hdc, pixelFormat, &pfd)) oops();
|
||||
ssassert(SetPixelFormat(hdc, pixelFormat, &pfd), "Cannot set pixel format");
|
||||
|
||||
*glrc = wglCreateContext(hdc);
|
||||
wglMakeCurrent(hdc, *glrc);
|
||||
|
@ -928,8 +928,6 @@ LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
|||
!!(wParam & MK_RBUTTON),
|
||||
!!(wParam & MK_SHIFT),
|
||||
!!(wParam & MK_CONTROL));
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -955,7 +953,7 @@ LRESULT CALLBACK GraphicsWndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
|||
break;
|
||||
}
|
||||
}
|
||||
if(SS.GW.menu[i].level < 0) oops();
|
||||
ssassert(SS.GW.menu[i].level >= 0, "Cannot find command in the menu");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -1153,8 +1151,8 @@ static void MenuById(int id, bool yes, bool check)
|
|||
if(SS.GW.menu[i].level == 0) subMenu++;
|
||||
|
||||
if(SS.GW.menu[i].id == id) {
|
||||
if(subMenu < 0) oops();
|
||||
if(subMenu >= (int)arraylen(SubMenus)) oops();
|
||||
ssassert(subMenu >= 0 && subMenu < (int)arraylen(SubMenus),
|
||||
"Submenu out of range");
|
||||
|
||||
if(check) {
|
||||
CheckMenuItem(SubMenus[subMenu], id,
|
||||
|
@ -1166,7 +1164,7 @@ static void MenuById(int id, bool yes, bool check)
|
|||
return;
|
||||
}
|
||||
}
|
||||
oops();
|
||||
ssassert(false, "Cannot find submenu");
|
||||
}
|
||||
void SolveSpace::CheckMenuById(int id, bool checked)
|
||||
{
|
||||
|
@ -1219,7 +1217,7 @@ HMENU CreateGraphicsWindowMenus(void)
|
|||
if(SS.GW.menu[i].level == 0) {
|
||||
m = CreateMenu();
|
||||
AppendMenuW(top, MF_STRING | MF_POPUP, (UINT_PTR)m, Widen(label).c_str());
|
||||
if(subMenu >= (int)arraylen(SubMenus)) oops();
|
||||
ssassert(subMenu < (int)arraylen(SubMenus), "Too many submenus");
|
||||
SubMenus[subMenu] = m;
|
||||
subMenu++;
|
||||
} else if(SS.GW.menu[i].level == 1) {
|
||||
|
@ -1236,7 +1234,7 @@ HMENU CreateGraphicsWindowMenus(void)
|
|||
} else {
|
||||
AppendMenuW(m, MF_SEPARATOR, SS.GW.menu[i].id, L"");
|
||||
}
|
||||
} else oops();
|
||||
} else ssassert(false, "Submenus nested too deeply");
|
||||
}
|
||||
RefreshRecentMenus();
|
||||
|
||||
|
@ -1261,7 +1259,7 @@ static void CreateMainWindows(void)
|
|||
IMAGE_ICON, 32, 32, 0);
|
||||
wc.hIconSm = (HICON)LoadImage(Instance, MAKEINTRESOURCE(4000),
|
||||
IMAGE_ICON, 16, 16, 0);
|
||||
if(!RegisterClassEx(&wc)) oops();
|
||||
ssassert(RegisterClassEx(&wc), "Cannot register window class");
|
||||
|
||||
HMENU top = CreateGraphicsWindowMenus();
|
||||
GraphicsWnd = CreateWindowExW(0, L"GraphicsWnd",
|
||||
|
@ -1269,7 +1267,7 @@ static void CreateMainWindows(void)
|
|||
WS_OVERLAPPED | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX |
|
||||
WS_MINIMIZEBOX | WS_SYSMENU | WS_SIZEBOX | WS_CLIPSIBLINGS,
|
||||
50, 50, 900, 600, NULL, top, Instance, NULL);
|
||||
if(!GraphicsWnd) oops();
|
||||
ssassert(GraphicsWnd != NULL, "Cannot create window");
|
||||
|
||||
GraphicsEditControl = CreateWindowExW(WS_EX_CLIENTEDGE, WC_EDIT, L"",
|
||||
WS_CHILD | ES_AUTOHSCROLL | WS_TABSTOP | WS_CLIPSIBLINGS,
|
||||
|
@ -1282,14 +1280,14 @@ static void CreateMainWindows(void)
|
|||
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
||||
wc.lpszClassName = L"TextWnd";
|
||||
wc.hCursor = NULL;
|
||||
if(!RegisterClassEx(&wc)) oops();
|
||||
ssassert(RegisterClassEx(&wc), "Cannot register window class");
|
||||
|
||||
// We get the desired Alt+Tab behaviour by specifying that the text
|
||||
// window is a child of the graphics window.
|
||||
TextWnd = CreateWindowExW(0,
|
||||
L"TextWnd", L"SolveSpace - Property Browser", WS_THICKFRAME | WS_CLIPCHILDREN,
|
||||
650, 500, 420, 300, GraphicsWnd, (HMENU)NULL, Instance, NULL);
|
||||
if(!TextWnd) oops();
|
||||
ssassert(TextWnd != NULL, "Cannot create window");
|
||||
|
||||
TextWndScrollBar = CreateWindowExW(0, WC_SCROLLBAR, L"", WS_CHILD |
|
||||
SBS_VERT | SBS_LEFTALIGN | WS_VISIBLE | WS_CLIPSIBLINGS,
|
||||
|
@ -1313,9 +1311,9 @@ static void CreateMainWindows(void)
|
|||
|
||||
const void *SolveSpace::LoadResource(const std::string &name, size_t *size) {
|
||||
HRSRC hres = FindResourceW(NULL, Widen(name).c_str(), RT_RCDATA);
|
||||
if(!hres) oops();
|
||||
ssassert(hres != NULL, "Cannot find resource");
|
||||
HGLOBAL res = LoadResource(NULL, hres);
|
||||
if(!res) oops();
|
||||
ssassert(res != NULL, "Cannot load resource");
|
||||
|
||||
*size = SizeofResource(NULL, hres);
|
||||
return LockResource(res);
|
||||
|
|
|
@ -40,8 +40,8 @@ std::string Narrow(const wchar_t *in)
|
|||
std::string out;
|
||||
DWORD len = WideCharToMultiByte(CP_UTF8, 0, in, -1, NULL, 0, NULL, NULL);
|
||||
out.resize(len - 1);
|
||||
if(!WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], len, NULL, NULL))
|
||||
oops();
|
||||
ssassert(WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], len, NULL, NULL),
|
||||
"Invalid UTF-16");
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -51,9 +51,9 @@ std::string Narrow(const std::wstring &in)
|
|||
|
||||
std::string out;
|
||||
out.resize(WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(), NULL, 0, NULL, NULL));
|
||||
if(!WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(),
|
||||
&out[0], out.length(), NULL, NULL))
|
||||
oops();
|
||||
ssassert(WideCharToMultiByte(CP_UTF8, 0, &in[0], in.length(),
|
||||
&out[0], out.length(), NULL, NULL),
|
||||
"Invalid UTF-16");
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -62,8 +62,8 @@ std::wstring Widen(const char *in)
|
|||
std::wstring out;
|
||||
DWORD len = MultiByteToWideChar(CP_UTF8, 0, in, -1, NULL, 0);
|
||||
out.resize(len - 1);
|
||||
if(!MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], len))
|
||||
oops();
|
||||
ssassert(MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], len),
|
||||
"Invalid UTF-8");
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -73,8 +73,8 @@ std::wstring Widen(const std::string &in)
|
|||
|
||||
std::wstring out;
|
||||
out.resize(MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), NULL, 0));
|
||||
if(!MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), &out[0], out.length()))
|
||||
oops();
|
||||
ssassert(MultiByteToWideChar(CP_UTF8, 0, &in[0], in.length(), &out[0], out.length()),
|
||||
"Invalid UTF-8");
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -88,13 +88,15 @@ FILE *ssfopen(const std::string &filename, const char *mode)
|
|||
if(uncFilename.substr(0, 2) != "\\\\")
|
||||
uncFilename = "\\\\?\\" + uncFilename;
|
||||
|
||||
if(filename.length() != strlen(filename.c_str())) oops();
|
||||
ssassert(filename.length() == strlen(filename.c_str()),
|
||||
"Unexpected null byte in middle of a path");
|
||||
return _wfopen(Widen(uncFilename).c_str(), Widen(mode).c_str());
|
||||
}
|
||||
|
||||
void ssremove(const std::string &filename)
|
||||
{
|
||||
if(filename.length() != strlen(filename.c_str())) oops();
|
||||
ssassert(filename.length() == strlen(filename.c_str()),
|
||||
"Unexpected null byte in middle of a path");
|
||||
_wremove(Widen(filename).c_str());
|
||||
}
|
||||
|
||||
|
@ -107,7 +109,7 @@ void ssremove(const std::string &filename)
|
|||
void *AllocTemporary(size_t n)
|
||||
{
|
||||
void *v = HeapAlloc(TempHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n);
|
||||
if(!v) oops();
|
||||
ssassert(v != NULL, "Cannot allocate memory");
|
||||
return v;
|
||||
}
|
||||
void FreeTemporary(void *p) {
|
||||
|
@ -124,7 +126,7 @@ void FreeAllTemporary(void)
|
|||
|
||||
void *MemAlloc(size_t n) {
|
||||
void *p = HeapAlloc(PermHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n);
|
||||
if(!p) oops();
|
||||
ssassert(p != NULL, "Cannot allocate memory");
|
||||
return p;
|
||||
}
|
||||
void MemFree(void *p) {
|
||||
|
@ -132,8 +134,8 @@ void MemFree(void *p) {
|
|||
}
|
||||
|
||||
void vl(void) {
|
||||
if(!HeapValidate(TempHeap, HEAP_NO_SERIALIZE, NULL)) oops();
|
||||
if(!HeapValidate(PermHeap, HEAP_NO_SERIALIZE, NULL)) oops();
|
||||
ssassert(HeapValidate(TempHeap, HEAP_NO_SERIALIZE, NULL), "Corrupted heap");
|
||||
ssassert(HeapValidate(PermHeap, HEAP_NO_SERIALIZE, NULL), "Corrupted heap");
|
||||
}
|
||||
|
||||
void InitHeaps(void) {
|
||||
|
|
|
@ -545,7 +545,7 @@ Vector SContour::ComputeNormal(void) {
|
|||
}
|
||||
|
||||
Vector SContour::AnyEdgeMidpoint(void) {
|
||||
if(l.n < 2) oops();
|
||||
ssassert(l.n >= 2, "Need two points to find a midpoint");
|
||||
return ((l.elem[0].p).Plus(l.elem[1].p)).ScaledBy(0.5);
|
||||
}
|
||||
|
||||
|
@ -696,7 +696,7 @@ bool SPolygon::IsEmpty(void) {
|
|||
}
|
||||
|
||||
Vector SPolygon::AnyPoint(void) {
|
||||
if(IsEmpty()) oops();
|
||||
ssassert(!IsEmpty(), "Need at least one point");
|
||||
return l.elem[0].l.elem[0].p;
|
||||
}
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ void Request::Generate(IdList<Entity,hEntity> *entity,
|
|||
// and this is just a copy of the workplane quaternion,
|
||||
// so no params required
|
||||
}
|
||||
if(points < 1) oops();
|
||||
ssassert(points >= 1, "Positioning a normal requires a point");
|
||||
// The point determines where the normal gets displayed on-screen;
|
||||
// it's entirely cosmetic.
|
||||
n.point[0] = e.point[0];
|
||||
|
|
|
@ -17,36 +17,31 @@ namespace SolveSpace {
|
|||
std::string LoadString(const std::string &name) {
|
||||
size_t size;
|
||||
const void *data = LoadResource(name, &size);
|
||||
if(data == NULL) oops();
|
||||
|
||||
return std::string(static_cast<const char *>(data), size);
|
||||
}
|
||||
|
||||
std::string LoadStringFromGzip(const std::string &name) {
|
||||
size_t size;
|
||||
const void *data = LoadResource(name, &size);
|
||||
if(data == NULL) oops();
|
||||
|
||||
z_stream stream;
|
||||
stream.zalloc = Z_NULL;
|
||||
stream.zfree = Z_NULL;
|
||||
stream.opaque = Z_NULL;
|
||||
if(inflateInit2(&stream, /*decode gzip header*/16) != Z_OK)
|
||||
oops();
|
||||
ssassert(inflateInit2(&stream, /*decode gzip header*/16) == Z_OK,
|
||||
"Cannot start inflation");
|
||||
|
||||
// Extract length mod 2**32 from the gzip trailer.
|
||||
std::string result;
|
||||
if(size < 4) oops();
|
||||
ssassert(size >= 4, "Resource too small to have gzip trailer");
|
||||
result.resize(*(uint32_t *)((uintptr_t)data + size - 4));
|
||||
|
||||
stream.next_in = (Bytef *)data;
|
||||
stream.avail_in = size;
|
||||
stream.next_out = (Bytef *)&result[0];
|
||||
stream.avail_out = result.length();
|
||||
if(inflate(&stream, Z_NO_FLUSH) != Z_STREAM_END)
|
||||
oops();
|
||||
if(stream.avail_out != 0)
|
||||
oops();
|
||||
ssassert(inflate(&stream, Z_NO_FLUSH) == Z_STREAM_END, "Cannot inflate resource");
|
||||
ssassert(stream.avail_out == 0, "Inflated resource larger than what trailer indicates");
|
||||
|
||||
inflateEnd(&stream);
|
||||
|
||||
|
@ -56,10 +51,9 @@ std::string LoadStringFromGzip(const std::string &name) {
|
|||
Pixmap LoadPNG(const std::string &name) {
|
||||
size_t size;
|
||||
const void *data = LoadResource(name, &size);
|
||||
if(data == NULL) oops();
|
||||
|
||||
Pixmap pixmap = Pixmap::FromPNG(static_cast<const uint8_t *>(data), size);
|
||||
if(pixmap.IsEmpty()) oops();
|
||||
ssassert(!pixmap.IsEmpty(), "Cannot load pixmap");
|
||||
|
||||
return pixmap;
|
||||
}
|
||||
|
@ -189,12 +183,12 @@ public:
|
|||
}
|
||||
|
||||
char ReadChar() {
|
||||
if(AtEnd()) oops();
|
||||
ssassert(!AtEnd(), "Unexpected EOF");
|
||||
return *pos++;
|
||||
}
|
||||
|
||||
bool TryChar(char c) {
|
||||
if(AtEnd()) oops();
|
||||
ssassert(!AtEnd(), "Unexpected EOF");
|
||||
if(*pos == c) {
|
||||
pos++;
|
||||
return true;
|
||||
|
@ -204,7 +198,7 @@ public:
|
|||
}
|
||||
|
||||
void ExpectChar(char c) {
|
||||
if(ReadChar() != c) oops();
|
||||
ssassert(ReadChar() == c, "Unexpected character");
|
||||
}
|
||||
|
||||
uint8_t Read4HexBits() {
|
||||
|
@ -215,7 +209,7 @@ public:
|
|||
return 10 + (c - 'a');
|
||||
} else if(c >= 'A' && c <= 'F') {
|
||||
return 10 + (c - 'A');
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected hex digit");
|
||||
}
|
||||
|
||||
uint8_t Read8HexBits() {
|
||||
|
@ -233,12 +227,12 @@ public:
|
|||
double ReadDoubleString() {
|
||||
char *endptr;
|
||||
double d = strtod(&*pos, &endptr);
|
||||
if(&*pos == endptr) oops();
|
||||
ssassert(&*pos != endptr, "Cannot read a double-precision number");
|
||||
pos += endptr - &*pos;
|
||||
return d;
|
||||
}
|
||||
|
||||
bool ReadRegex(const std::regex &re, std::smatch *m) {
|
||||
bool TryRegex(const std::regex &re, std::smatch *m) {
|
||||
if(std::regex_search(pos, end, *m, re, std::regex_constants::match_continuous)) {
|
||||
pos = (*m)[0].second;
|
||||
return true;
|
||||
|
@ -269,9 +263,12 @@ BitmapFont BitmapFont::From(std::string &&unifontData) {
|
|||
}
|
||||
|
||||
void BitmapFont::AddGlyph(char32_t codepoint, const Pixmap &pixmap) {
|
||||
if(pixmap.width != 8 && pixmap.width != 16 && pixmap.height != 16) oops();
|
||||
if(glyphs.find(codepoint) != glyphs.end()) oops();
|
||||
if(nextPosition == 0xffff) oops();
|
||||
ssassert((pixmap.width == 8 || pixmap.width == 16) && pixmap.height == 16,
|
||||
"Unexpected glyph dimensions");
|
||||
ssassert(glyphs.find(codepoint) == glyphs.end(),
|
||||
"Glyph with this codepoint already exists");
|
||||
ssassert(nextPosition != 0xffff,
|
||||
"Too many glyphs for current texture size");
|
||||
|
||||
BitmapFont::Glyph glyph = {};
|
||||
glyph.advanceCells = pixmap.width / 8;
|
||||
|
@ -294,7 +291,8 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) {
|
|||
return (*it).second;
|
||||
}
|
||||
|
||||
if(nextPosition == 0xffff) oops();
|
||||
ssassert(nextPosition != 0xffff,
|
||||
"Too many glyphs for current texture size");
|
||||
|
||||
// Find the hex representation in the (sorted) Unifont file.
|
||||
auto first = unifontData.cbegin(),
|
||||
|
@ -344,7 +342,7 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) {
|
|||
for(size_t i = 0; i < 16; i++) {
|
||||
glyphBits[i] = (uint16_t)reader.Read8HexBits() << 8;
|
||||
}
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected glyph bitmap length");
|
||||
|
||||
// Fill in the texture (one texture byte per glyph bit).
|
||||
for(size_t y = 0; y < 16; y++) {
|
||||
|
@ -361,7 +359,7 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) {
|
|||
}
|
||||
|
||||
// Glyph doesn't exist; return replacement glyph instead.
|
||||
if(codepoint == 0xfffd) oops();
|
||||
ssassert(codepoint != 0xfffd, "Cannot parse replacement glyph");
|
||||
return GetGlyph(0xfffd);
|
||||
}
|
||||
|
||||
|
@ -461,7 +459,7 @@ VectorFont VectorFont::From(std::string &&lffData) {
|
|||
|
||||
ASCIIReader reader = ASCIIReader::From(font.lffData);
|
||||
std::smatch m;
|
||||
while(reader.ReadRegex(std::regex("#\\s*(\\w+)\\s*:\\s*(.+?)\n"), &m)) {
|
||||
while(reader.TryRegex(std::regex("#\\s*(\\w+)\\s*:\\s*(.+?)\n"), &m)) {
|
||||
std::string name = m.str(1),
|
||||
value = m.str(2);
|
||||
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
|
||||
|
@ -488,7 +486,7 @@ const VectorFont::Glyph &VectorFont::GetGlyph(char32_t codepoint) {
|
|||
}
|
||||
|
||||
auto firstGlyph = std::find(lffData.cbegin(), lffData.cend(), '[');
|
||||
if(firstGlyph == lffData.cend()) oops();
|
||||
ssassert(firstGlyph != lffData.cend(), "Vector font contains no glyphs");
|
||||
|
||||
// Find the serialized representation in the (sorted) lff file.
|
||||
auto first = firstGlyph,
|
||||
|
@ -572,7 +570,7 @@ const VectorFont::Glyph &VectorFont::GetGlyph(char32_t codepoint) {
|
|||
}
|
||||
|
||||
// Glyph doesn't exist; return replacement glyph instead.
|
||||
if(codepoint == 0xfffd) oops();
|
||||
ssassert(codepoint != 0xfffd, "Cannot parse replacement glyph");
|
||||
return GetGlyph(0xfffd);
|
||||
}
|
||||
|
||||
|
|
|
@ -881,7 +881,7 @@ inline hRequest hEntity::request(void)
|
|||
inline hGroup hEntity::group(void)
|
||||
{ hGroup r; r.v = (v >> 16) & 0x3fff; return r; }
|
||||
inline hEquation hEntity::equation(int i)
|
||||
{ if(i != 0) oops(); hEquation r; r.v = v | 0x40000000; return r; }
|
||||
{ hEquation r; r.v = v | 0x40000000; return r; }
|
||||
|
||||
inline hRequest hParam::request(void)
|
||||
{ hRequest r; r.v = (v >> 16); return r; }
|
||||
|
|
|
@ -426,7 +426,7 @@ bool SolveSpaceUI::OkayToStartNewFile(void) {
|
|||
case DIALOG_CANCEL:
|
||||
return false;
|
||||
|
||||
default: oops(); break;
|
||||
default: ssassert(false, "Unexpected dialog choice");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -557,7 +557,7 @@ void SolveSpaceUI::MenuFile(int id) {
|
|||
ImportDxf(importFile);
|
||||
} else if(Extension(importFile) == "dwg") {
|
||||
ImportDwg(importFile);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected extension of file to import");
|
||||
|
||||
SS.GenerateAll(SolveSpaceUI::GENERATE_UNTIL_ACTIVE);
|
||||
SS.ScheduleShowTW();
|
||||
|
@ -569,7 +569,7 @@ void SolveSpaceUI::MenuFile(int id) {
|
|||
SS.Exit();
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
|
||||
SS.UpdateWindowTitle();
|
||||
|
@ -796,7 +796,7 @@ void SolveSpaceUI::MenuAnalyze(int id) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -823,7 +823,7 @@ void SolveSpaceUI::MenuHelp(int id) {
|
|||
);
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected menu ID");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,8 +74,6 @@ struct FT_FaceRec_;
|
|||
} while(0)
|
||||
#endif
|
||||
|
||||
#define oops() ssassert(false, "oops() called")
|
||||
|
||||
#ifndef isnan
|
||||
# define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11))
|
||||
#endif
|
||||
|
|
|
@ -43,7 +43,7 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB,
|
|||
ret.pts = {};
|
||||
|
||||
SCurvePt *p = pts.First();
|
||||
if(!p) oops();
|
||||
ssassert(p != NULL, "Cannot split an empty curve");
|
||||
SCurvePt prev = *p;
|
||||
ret.pts.Add(p);
|
||||
p = pts.NextAfter(p);
|
||||
|
@ -221,7 +221,7 @@ static bool KeepRegion(int type, bool opA, int shell, int orig)
|
|||
return (inShell && !inFace) || inSame;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected shell type");
|
||||
}
|
||||
}
|
||||
static bool KeepEdge(int type, bool opA,
|
||||
|
@ -295,7 +295,7 @@ static void DEBUGEDGELIST(SEdgeList *sel, SSurface *surf) {
|
|||
void SSurface::FindChainAvoiding(SEdgeList *src, SEdgeList *dest,
|
||||
SPointList *avoid)
|
||||
{
|
||||
if(src->l.n < 1) oops();
|
||||
ssassert(src->l.n > 0, "Need at least one edge");
|
||||
// Start with an arbitrary edge.
|
||||
dest->l.Add(&(src->l.elem[0]));
|
||||
src->l.ClearTags();
|
||||
|
|
|
@ -764,7 +764,7 @@ SSurface *SCurve::GetSurfaceA(SShell *a, SShell *b) {
|
|||
return b->surface.FindById(surfA);
|
||||
} else if(source == FROM_INTERSECTION) {
|
||||
return a->surface.FindById(surfA);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected curve source");
|
||||
}
|
||||
|
||||
SSurface *SCurve::GetSurfaceB(SShell *a, SShell *b) {
|
||||
|
@ -774,7 +774,7 @@ SSurface *SCurve::GetSurfaceB(SShell *a, SShell *b) {
|
|||
return b->surface.FindById(surfB);
|
||||
} else if(source == FROM_INTERSECTION) {
|
||||
return b->surface.FindById(surfB);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected curve source");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
@ -51,7 +51,7 @@ double SolveSpace::Bernstein(int k, int deg, double t)
|
|||
}
|
||||
break;
|
||||
}
|
||||
oops();
|
||||
ssassert(false, "Unexpected degree of spline");
|
||||
}
|
||||
|
||||
double SolveSpace::BernsteinDerivative(int k, int deg, double t)
|
||||
|
@ -90,7 +90,7 @@ double SolveSpace::BernsteinDerivative(int k, int deg, double t)
|
|||
}
|
||||
break;
|
||||
}
|
||||
oops();
|
||||
ssassert(false, "Unexpected degree of spline");
|
||||
}
|
||||
|
||||
Vector SBezier::PointAt(double t) {
|
||||
|
@ -222,7 +222,7 @@ void SBezier::SplitAt(double t, SBezier *bef, SBezier *aft) {
|
|||
*aft = SBezier::From(cts, ct12_23, ct23, ct[3]);
|
||||
break;
|
||||
}
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected degree of spline");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -308,7 +308,7 @@ void SBezier::MakePwlInitialWorker(List<Vector> *l, double ta, double tb, double
|
|||
double d = max({
|
||||
pm1.DistanceToLine(pa, dir),
|
||||
pm2.DistanceToLine(pa, dir),
|
||||
pm3.DistanceToLine(pa, dir)
|
||||
pm3.DistanceToLine(pa, dir)
|
||||
});
|
||||
|
||||
double step = 1.0/SS.GetMaxSegments();
|
||||
|
|
|
@ -172,7 +172,7 @@ void SSurface::SplitInHalf(bool byU, SSurface *sa, SSurface *sb) {
|
|||
break;
|
||||
}
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected degree of spline");
|
||||
}
|
||||
|
||||
sa->UnWeightControlPoints();
|
||||
|
|
|
@ -97,8 +97,8 @@ void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB,
|
|||
}
|
||||
}
|
||||
#endif // 0
|
||||
// Nothing should be generating zero-len edges.
|
||||
if((sb->Start()).Equals(sb->Finish())) oops();
|
||||
ssassert(!(sb->Start()).Equals(sb->Finish()),
|
||||
"Unexpected zero-length edge");
|
||||
|
||||
split.source = SCurve::FROM_INTERSECTION;
|
||||
into->curve.AddAndAssignId(&split);
|
||||
|
|
|
@ -554,7 +554,7 @@ void TextWindow::ScreenChangeStyleMetric(int link, uint32_t v) {
|
|||
meaning = EDIT_STYLE_WIDTH;
|
||||
break;
|
||||
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected link");
|
||||
}
|
||||
|
||||
std::string edit_value;
|
||||
|
@ -588,9 +588,7 @@ void TextWindow::ScreenChangeStyleColor(int link, uint32_t v) {
|
|||
} else if(link == 'f') {
|
||||
em = EDIT_STYLE_FILL_COLOR;
|
||||
rgb = s->fillColor;
|
||||
} else {
|
||||
oops();
|
||||
}
|
||||
} else ssassert(false, "Unexpected link");
|
||||
SS.TW.ShowEditControlWithColorPicker(13, rgb);
|
||||
SS.TW.edit.style = hs;
|
||||
SS.TW.edit.meaning = em;
|
||||
|
@ -840,7 +838,7 @@ void TextWindow::ShowStyleInfo(void) {
|
|||
case '_': patterns[i] += "\xEE\x80\x85"; break;
|
||||
case '-': patterns[i] += "\xEE\x80\x86"; break;
|
||||
case '~': patterns[i] += "\xEE\x80\x87"; break;
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected stipple pattern element");
|
||||
}
|
||||
} while(*(++str));
|
||||
}
|
||||
|
|
|
@ -788,10 +788,7 @@ void TextWindow::EditControlDone(const char *s) {
|
|||
if(EditControlDoneForConfiguration(s)) cnt++;
|
||||
if(EditControlDoneForPaste(s)) cnt++;
|
||||
if(EditControlDoneForView(s)) cnt++;
|
||||
if(cnt > 1) {
|
||||
// The identifiers were somehow assigned not uniquely?
|
||||
oops();
|
||||
}
|
||||
ssassert(cnt == 1, "Expected exactly one parameter to be edited");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ void TextWindow::MakeColorTable(const Color *in, float *out) {
|
|||
int i;
|
||||
for(i = 0; in[i].c != 0; i++) {
|
||||
int c = in[i].c;
|
||||
if(c < 0 || c > 255) oops();
|
||||
ssassert(c >= 0 && c <= 255, "Unexpected color index");
|
||||
out[c*3 + 0] = in[i].color.redF();
|
||||
out[c*3 + 1] = in[i].color.greenF();
|
||||
out[c*3 + 2] = in[i].color.blueF();
|
||||
|
|
|
@ -218,7 +218,7 @@ static const FT_Outline_Funcs outline_funcs = {
|
|||
void TtfFont::PlotString(const std::string &str,
|
||||
SBezierList *sbl, Vector origin, Vector u, Vector v)
|
||||
{
|
||||
if(fontFace == NULL) oops();
|
||||
ssassert(fontFace != NULL, "Expected font face to be loaded");
|
||||
|
||||
FT_Pos dx = 0;
|
||||
for(char32_t chr : ReadUTF8(str)) {
|
||||
|
|
|
@ -100,7 +100,7 @@ void SolveSpaceUI::PushFromCurrentOnto(UndoStack *uk) {
|
|||
void SolveSpaceUI::PopOntoCurrentFrom(UndoStack *uk) {
|
||||
int i;
|
||||
|
||||
if(uk->cnt <= 0) oops();
|
||||
ssassert(uk->cnt > 0, "Cannot pop from empty undo stack");
|
||||
(uk->cnt)--;
|
||||
uk->write = WRAP(uk->write - 1, MAX_UNDO);
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ std::string SolveSpace::ssprintf(const char *fmt, ...)
|
|||
|
||||
va_start(va, fmt);
|
||||
int size = vsnprintf(NULL, 0, fmt, va);
|
||||
if(size < 0) oops();
|
||||
ssassert(size >= 0, "vsnprintf could not encode string");
|
||||
va_end(va);
|
||||
|
||||
std::string result;
|
||||
|
@ -418,7 +418,7 @@ double Vector::Element(int i) {
|
|||
case 0: return x;
|
||||
case 1: return y;
|
||||
case 2: return z;
|
||||
default: oops();
|
||||
default: ssassert(false, "Unexpected vector element index");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -514,7 +514,7 @@ Vector Vector::Normal(int which) {
|
|||
// That's the vector we return.
|
||||
} else if(which == 1) {
|
||||
n = this->Cross(n);
|
||||
} else oops();
|
||||
} else ssassert(false, "Unexpected vector normal index");
|
||||
|
||||
n = n.WithMagnitude(1);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user