Browse Source

Gmt module: Conversion function for GMTPen now using new parameter reading scheme and error reporting.

gmtdatadir
Michael Uleysky 8 years ago
parent
commit
cbfd462ff0
  1. 160
      modules/gmt/modgmt_func.h

160
modules/gmt/modgmt_func.h

@ -174,6 +174,8 @@ using Base2Coord =Base2Struct<struct gmt_coord>;
using Base2Region=Base2Struct<struct gmt_region>;
using Base2Proj =Base2Struct<struct gmt_projection>;
using Base2Color =Base2Struct<struct gmt_color>;
using Base2Dash =Base2Struct<struct gmt_dash>;
using Base2Pen =Base2Struct<struct gmt_pen>;
// Simple aliases of convertors with default values
using Base2StringD=Base2StructD<std::string>;
@ -194,7 +196,37 @@ class Base2CoordD: public DefaultConverter<Base2Coord>
Base2CoordD(double d):DefaultConverter<Base2Coord>(Def(d)) {}
};
// Convertors for double non-negative value
// Convertor with default value for gmt_color. Added constructor for creating default value from double argument
class Base2ColorD: public DefaultConverter<Base2Color>
{
static ValueType Def(double d)
{
ValueType v;
std::string fake;
v.Convert(d,fake);
return v;
}
public:
using ValueType=DefaultConverter<Base2Color>::ValueType;
Base2ColorD(double d):DefaultConverter<Base2Color>(Def(d)) {}
};
// Convertor with default value for gmt_dash. Default value is always no dash.
class Base2DashD: public DefaultConverter<Base2Dash>
{
static ValueType Def()
{
ValueType v;
v.Clear();
return v;
}
public:
using ValueType=DefaultConverter<Base2Dash>::ValueType;
Base2DashD():DefaultConverter<Base2Dash>(Def()) {}
};
// Convertors for double positive value
class Base2Pos: public Base2Double
{
public:
@ -211,6 +243,23 @@ class Base2Pos: public Base2Double
};
using Base2PosD=DefaultConverter<Base2Pos>;
// Convertors for double non-negative value
class Base2NonNeg: public Base2Double
{
public:
double Convert(const ObjectBase* ob, bool* res, std::string& err)
{
double t=Base2Double::Convert(ob,res,err);
if(res && t<0)
{
*res=false;
err="Value mast be non-negative";
}
return t;
}
};
using Base2NonNegD=DefaultConverter<Base2NonNeg>;
// Convertors for double values which must be in some interval
template<int32_t Min, int32_t Max>
class Base2InRange: public Base2Double
@ -837,9 +886,6 @@ class Convert2Struct<struct gmt_color, ObjectList>
}
};
// Helper types
typedef SearchParameterWDefO<double,DoubleDefaultVal<>,false,PMin<0> > Base2Width;
typedef SearchParameter<double,false,PMin<0> > BaseM2Width;
// Converting List to GMTPen
/*
@ -860,91 +906,53 @@ class Convert2Struct<struct gmt_pen, ObjectList>
{
public:
struct gmt_pen operator()(const ObjectList* input, bool* issuc) const
struct gmt_pen operator()(const ObjectList* input, bool* issuc, std::string& err) const
{
struct gmt_pen p;
auto size=input->Size();
if(1==size) // Cases 1, 2 and 4
if(1==input->Size()) // Cases 1, 2 and 4
{
Base2Pen pen(input,0);
Base2Pen pen;
bool suc=true;
p=pen(&suc);
p=pen.Convert(input->At(0),&suc,err);
if(!suc) goto fail; // Conversion failed
return p;
}
// Case 3
// Case 5 and 6
{
bool casevalid=false;
bool upd;
{
BaseMT2Pen updarg(input,"pen","p");
bool suc=true;
p=updarg(&upd,&suc);
if(upd && !suc) goto fail; // Conversion failed or too many arguments
}
if(!upd)
{
// default pen is solid black 1mm width
p.width=gmt_pen::default_width;
p.color.Convert(0);
p.dash.Clear();
}
{
BaseM2Width w(input,"w","width");
if(w.Exist())
{
bool suc=true;
p.width=w(&suc);
if(!suc) goto fail; // Parsing error
casevalid=true;
}
}
// Color
{
BaseMT2Color color(input,"color","c");
if(color.Exist())
{
bool suc=true;
p.color=color(&suc);
if(!suc) goto fail; // Parsing error
casevalid=true;
}
}
// Dash
{
BaseMT2Dash dash(input,"dash","d");
if(dash.Exist())
{
bool suc=true;
p.dash=dash(&suc);
if(!suc) goto fail; // Parsing error
p.dash.width=p.width;
casevalid=true;
}
}
if(casevalid || upd) return p; // Pen created or updated
OPosPar<Base2NonNegD> width("width",gmt_pen::default_width);
OPosPar<Base2ColorD> color("color",0.0);
OPosPar<Base2DashD> dash("dash");
ParsePositionalParameters params(input,width,color,dash);
if(!params) goto case3; // May be case3 will work
p.color=color;
p.dash=dash;
p.dash.width=p.width=width;
return p;
}
// Case 5 and 6
if(2==size || 3==size)
// Case 3
case3:
{
Base2Width w(input,0);
Base2Color c(input,1);
Base2Dash d(input,2);
bool suc=true;
p.width=w(&suc);
p.color=c(&suc);
if(!suc) goto fail; // Something wrong
p.dash=d(&suc,p.width);
if(!suc) goto fail; // Something wrong
return p;
bool upd;
ONFPar<Base2Pen,ObjectGMTPen> pen("pen");
ONFPar<Base2ColorD,ObjectGMTColor> color("color",0.0);
ONFPar<Base2DashD,ObjectGMTDash> dash("dash");
ONPar<Base2NonNegD> width("width",gmt_pen::default_width);
{ParseNamedParameters params(input,color,pen,dash,width); if(!params) {err=params.Error(); goto fail;} } // Fail to parse by variant 3
upd=pen.Exist();
if(upd) p=pen;
if(color.Exist() || !upd) p.color=color;
if(dash.Exist() || !upd) p.dash=dash;
if(width.Exist() || !upd) p.width=width;
p.dash.width=p.width;
if(color.Exist() || dash.Exist() || width.Exist() || upd) return p; // Pen created or updated
err="Specify at least one of color, dash or width";
}
fail:

Loading…
Cancel
Save