Remove unique pointer

This commit is contained in:
yorickdewid 2016-03-01 19:42:19 +01:00
parent f4c9f9067c
commit 8601bb11c3
3 changed files with 288 additions and 271 deletions

View File

@ -10,5 +10,9 @@ all: iban.so
iban.so: iban.cc iban.so: iban.cc
$(CC) $(CFLAGS) -o iban.o -c iban.cc $(INCLUDEDIRS) $(CC) $(CFLAGS) -o iban.o -c iban.cc $(INCLUDEDIRS)
$(CC) -shared -o iban.so iban.o $(LIBDIR) -lpq -lm $(CC) -Wl,--gc-sections -shared -o iban.so iban.o $(LIBDIR) -lpq -lm -lstdc++
# cp iban.so $(LIBINSTALL) # cp iban.so $(LIBINSTALL)
clean:
@$(RM) -rf *.o
@$(RM) -rf iban.so

374
iban.cc
View File

@ -24,8 +24,8 @@ extern "C"
extern Datum iban_validate(PG_FUNCTION_ARGS); extern Datum iban_validate(PG_FUNCTION_ARGS);
} }
void Validate::addSpecification(std::unique_ptr<Specification> specPtr) { void Validate::addSpecification(Specification* specPtr) {
this->specifications[specPtr->countryCode] = std::move(specPtr); this->specifications[specPtr->countryCode] = specPtr;
} }
/** /**
@ -105,285 +105,291 @@ std::regex parseStructure(std::string structure) {
} }
void Validate::setSelectedSpecification(std::string countryCode) { void Validate::setSelectedSpecification(std::string countryCode) {
this->selectedSpec = std::move(this->specifications[countryCode]); this->selectedSpec = this->specifications[countryCode];
} }
bool Validate::isValid(std::string arg) { bool Validate::isValid(std::string arg) {
std::unique_ptr<Specification> spec; Specification* spec = new Specification("", 0, "", arg);
spec = (std::make_unique<Specification>("", 0, "", arg));
if (!this->selectedSpec) { if (!this->selectedSpec) {
std::transform(spec->example.begin(), spec->example.end(), std::transform(spec->example.begin(), spec->example.end(), spec->example.begin(), toupper);
spec->example.begin(), toupper);
spec->countryCode = spec->example.substr(0, 2); spec->countryCode = spec->example.substr(0, 2);
spec->length = spec->example.length(); spec->length = spec->example.length();
setSelectedSpecification(spec->countryCode); setSelectedSpecification(spec->countryCode);
} }
if (!(this->selectedSpec == nullptr)) { if (!(this->selectedSpec == nullptr)) {
std::string shortened = spec->example.substr(4, spec->example.length()); std::string shortened = spec->example.substr(4, spec->example.length());
return this->selectedSpec->length == spec->length bool result = this->selectedSpec->length == spec->length
&& this->selectedSpec->countryCode.compare( && this->selectedSpec->countryCode.compare(spec->countryCode) == 0
spec->countryCode) == 0 && std::regex_match(shortened, parseStructure(this->selectedSpec->structure))
&& std::regex_match(shortened, parseStructure(
this->selectedSpec->structure))
&& iso7064Mod97_10(spec->example); && iso7064Mod97_10(spec->example);
delete spec;
return result;
} else { } else {
delete spec;
return false; return false;
} }
} }
Validate::~Validate() {
for (auto it = specifications.begin(); it != specifications.end(); it++) {
delete it->second;
}
}
Validate::Validate() { Validate::Validate() {
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AD", 24, "F04F04A12", "AD", 24, "F04F04A12",
"AD1200012030200359100100"))); "AD1200012030200359100100"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AE", 23, "F03F16", "AE", 23, "F03F16",
"AE070331234567890123456"))); "AE070331234567890123456"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AL", 28, "F08A16", "AL", 28, "F08A16",
"AL47212110090000000235698741"))); "AL47212110090000000235698741"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AT", 20, "F05F11", "AT", 20, "F05F11",
"AT611904300234573201"))); "AT611904300234573201"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AZ", 28, "U04A20", "AZ", 28, "U04A20",
"AZ21NABZ00000000137010001944"))); "AZ21NABZ00000000137010001944"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BA", 20, "F03F03F08F02", "BA", 20, "F03F03F08F02",
"BA391290079401028494"))); "BA391290079401028494"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BE", 16, "F03F07F02", "BE", 16, "F03F07F02",
"BE68539007547034"))); "BE68539007547034"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BG", 22, "U04F04F02A08", "BG", 22, "U04F04F02A08",
"BG80BNBG96611020345678"))); "BG80BNBG96611020345678"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BH", 22, "U04A14", "BH", 22, "U04A14",
"BH67BMAG00001299123456"))); "BH67BMAG00001299123456"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BR", 29, "F08F05F10U01A01", "BR", 29, "F08F05F10U01A01",
"BR9700360305000010009795493P1"))); "BR9700360305000010009795493P1"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CH", 21, "F05A12", "CH", 21, "F05A12",
"CH9300762011623852957"))); "CH9300762011623852957"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CR", 21, "F03F14", "CR", 21, "F03F14",
"CR0515202001026284066"))); "CR0515202001026284066"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CY", 28, "F03F05A16", "CY", 28, "F03F05A16",
"CY17002001280000001200527600"))); "CY17002001280000001200527600"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CZ", 24, "F04F06F10", "CZ", 24, "F04F06F10",
"CZ6508000000192000145399"))); "CZ6508000000192000145399"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"DE", 22, "F08F10", "DE", 22, "F08F10",
"DE89370400440532013000"))); "DE89370400440532013000"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"DK", 18, "F04F09F01", "DK", 18, "F04F09F01",
"DK5000400440116243"))); "DK5000400440116243"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"DO", 28, "U04F20", "DO", 28, "U04F20",
"DO28BAGR00000001212453611324"))); "DO28BAGR00000001212453611324"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"EE", 20, "F02F02F11F01", "EE", 20, "F02F02F11F01",
"EE382200221020145685"))); "EE382200221020145685"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"ES", 24, "F04F04F01F01F10", "ES", 24, "F04F04F01F01F10",
"ES9121000418450200051332"))); "ES9121000418450200051332"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"FI", 18, "F06F07F01", "FI", 18, "F06F07F01",
"FI2112345600000785"))); "FI2112345600000785"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"FO", 18, "F04F09F01", "FO", 18, "F04F09F01",
"FO6264600001631634"))); "FO6264600001631634"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"FR", 27, "F05F05A11F02", "FR", 27, "F05F05A11F02",
"FR1420041010050500013M02606"))); "FR1420041010050500013M02606"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GB", 22, "U04F06F08", "GB", 22, "U04F06F08",
"GB29NWBK60161331926819"))); "GB29NWBK60161331926819"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GE", 22, "U02F16", "GE", 22, "U02F16",
"GE29NB0000000101904917"))); "GE29NB0000000101904917"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GI", 23, "U04A15", "GI", 23, "U04A15",
"GI75NWBK000000007099453"))); "GI75NWBK000000007099453"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GL", 18, "F04F09F01", "GL", 18, "F04F09F01",
"GL8964710001000206"))); "GL8964710001000206"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GR", 27, "F03F04A16", "GR", 27, "F03F04A16",
"GR1601101250000000012300695"))); "GR1601101250000000012300695"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"GT", 28, "A04A20", "GT", 28, "A04A20",
"GT82TRAJ01020000001210029690"))); "GT82TRAJ01020000001210029690"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"HR", 21, "F07F10", "HR", 21, "F07F10",
"HR1210010051863000160"))); "HR1210010051863000160"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"HU", 28, "F03F04F01F15F01", "HU", 28, "F03F04F01F15F01",
"HU42117730161111101800000000"))); "HU42117730161111101800000000"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"IE", 22, "U04F06F08", "IE", 22, "U04F06F08",
"IE29AIBK93115212345678"))); "IE29AIBK93115212345678"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"IL", 23, "F03F03F13", "IL", 23, "F03F03F13",
"IL620108000000099999999"))); "IL620108000000099999999"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"IS", 26, "F04F02F06F10", "IS", 26, "F04F02F06F10",
"IS140159260076545510730339"))); "IS140159260076545510730339"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"IT", 27, "U01F05F05A12", "IT", 27, "U01F05F05A12",
"IT60X0542811101000000123456"))); "IT60X0542811101000000123456"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"KW", 30, "U04A22", "KW", 30, "U04A22",
"KW81CBKU0000000000001234560101"))); "KW81CBKU0000000000001234560101"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"KZ", 20, "F03A13", "KZ", 20, "F03A13",
"KZ86125KZT5004100100"))); "KZ86125KZT5004100100"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LB", 28, "F04A20", "LB", 28, "F04A20",
"LB62099900000001001901229114"))); "LB62099900000001001901229114"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LC", 32, "U04F24", "LC", 32, "U04F24",
"LC07HEMM000100010012001200013015"))); "LC07HEMM000100010012001200013015"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LI", 21, "F05A12", "LI", 21, "F05A12",
"LI21088100002324013AA"))); "LI21088100002324013AA"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LT", 20, "F05F11", "LT", 20, "F05F11",
"LT121000011101001000"))); "LT121000011101001000"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LU", 20, "F03A13", "LU", 20, "F03A13",
"LU280019400644750000"))); "LU280019400644750000"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"LV", 21, "U04A13", "LV", 21, "U04A13",
"LV80BANK0000435195001"))); "LV80BANK0000435195001"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MC", 27, "F05F05A11F02", "MC", 27, "F05F05A11F02",
"MC5811222000010123456789030"))); "MC5811222000010123456789030"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MD", 24, "U02A18", "MD", 24, "U02A18",
"MD24AG000225100013104168"))); "MD24AG000225100013104168"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"ME", 22, "F03F13F02", "ME", 22, "F03F13F02",
"ME25505000012345678951"))); "ME25505000012345678951"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MK", 19, "F03A10F02", "MK", 19, "F03A10F02",
"MK07250120000058984"))); "MK07250120000058984"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MR", 27, "F05F05F11F02", "MR", 27, "F05F05F11F02",
"MR1300020001010000123456753"))); "MR1300020001010000123456753"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MT", 31, "U04F05A18", "MT", 31, "U04F05A18",
"MT84MALT011000012345MTLCAST001S"))); "MT84MALT011000012345MTLCAST001S"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MU", 30, "U04F02F02F12F03U03", "MU", 30, "U04F02F02F12F03U03",
"MU17BOMM0101101030300200000MUR"))); "MU17BOMM0101101030300200000MUR"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"NL", 18, "U04F10", "NL", 18, "U04F10",
"NL91ABNA0417164300"))); "NL91ABNA0417164300"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"NO", 15, "F04F06F01", "NO", 15, "F04F06F01",
"NO9386011117947"))); "NO9386011117947"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"PK", 24, "U04A16", "PK", 24, "U04A16",
"PK36SCBL0000001123456702"))); "PK36SCBL0000001123456702"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"PL", 28, "F08F16", "PL", 28, "F08F16",
"PL61109010140000071219812874"))); "PL61109010140000071219812874"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"PS", 29, "U04A21", "PS", 29, "U04A21",
"PS92PALS000000000400123456702"))); "PS92PALS000000000400123456702"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"PT", 25, "F04F04F11F02", "PT", 25, "F04F04F11F02",
"PT50000201231234567890154"))); "PT50000201231234567890154"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"RO", 24, "U04A16", "RO", 24, "U04A16",
"RO49AAAA1B31007593840000"))); "RO49AAAA1B31007593840000"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"RS", 22, "F03F13F02", "RS", 22, "F03F13F02",
"RS35260005601001611379"))); "RS35260005601001611379"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SA", 24, "F02A18", "SA", 24, "F02A18",
"SA0380000000608010167519"))); "SA0380000000608010167519"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SE", 24, "F03F16F01", "SE", 24, "F03F16F01",
"SE4550000000058398257466"))); "SE4550000000058398257466"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SI", 19, "F05F08F02", "SI", 19, "F05F08F02",
"SI56263300012039086"))); "SI56263300012039086"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SK", 24, "F04F06F10", "SK", 24, "F04F06F10",
"SK3112000000198742637541"))); "SK3112000000198742637541"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SM", 27, "U01F05F05A12", "SM", 27, "U01F05F05A12",
"SM86U0322509800000000270100"))); "SM86U0322509800000000270100"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"ST", 25, "F08F11F02", "ST", 25, "F08F11F02",
"ST68000100010051845310112"))); "ST68000100010051845310112"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"TL", 23, "F03F14F02", "TL", 23, "F03F14F02",
"TL380080012345678910157"))); "TL380080012345678910157"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"TN", 24, "F02F03F13F02", "TN", 24, "F02F03F13F02",
"TN5910006035183598478831"))); "TN5910006035183598478831"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"TR", 26, "F05F01A16", "TR", 26, "F05F01A16",
"TR330006100519786457841326"))); "TR330006100519786457841326"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"VG", 24, "U04F16", "VG", 24, "U04F16",
"VG96VPVG0000012345678901"))); "VG96VPVG0000012345678901"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"XK", 20, "F04F10F02", "XK", 20, "F04F10F02",
"XK051212012345678906"))); "XK051212012345678906"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"AO", 25, "F21", "AO", 25, "F21",
"AO69123456789012345678901"))); "AO69123456789012345678901"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BF", 27, "F23", "BF", 27, "F23",
"BF2312345678901234567890123"))); "BF2312345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BI", 16, "F12", "BI", 16, "F12",
"BI41123456789012"))); "BI41123456789012"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"BJ", 28, "F24", "BJ", 28, "F24",
"BJ39123456789012345678901234"))); "BJ39123456789012345678901234"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CI", 28, "U01F23", "CI", 28, "U01F23",
"CI17A12345678901234567890123"))); "CI17A12345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CM", 27, "F23", "CM", 27, "F23",
"CM9012345678901234567890123"))); "CM9012345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"CV", 25, "F21", "CV", 25, "F21",
"CV30123456789012345678901"))); "CV30123456789012345678901"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"DZ", 24, "F20", "DZ", 24, "F20",
"DZ8612345678901234567890"))); "DZ8612345678901234567890"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"IR", 26, "F22", "IR", 26, "F22",
"IR861234568790123456789012"))); "IR861234568790123456789012"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"JO", 30, "A04F22", "JO", 30, "A04F22",
"JO15AAAA1234567890123456789012"))); "JO15AAAA1234567890123456789012"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MG", 27, "F23", "MG", 27, "F23",
"MG1812345678901234567890123"))); "MG1812345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"ML", 28, "U01F23", "ML", 28, "U01F23",
"ML15A12345678901234567890123"))); "ML15A12345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"MZ", 25, "F21", "MZ", 25, "F21",
"MZ25123456789012345678901"))); "MZ25123456789012345678901"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"QA", 29, "U04A21", "QA", 29, "U04A21",
"QA30AAAA123456789012345678901"))); "QA30AAAA123456789012345678901"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"SN", 28, "U01F23", "SN", 28, "U01F23",
"SN52A12345678901234567890123"))); "SN52A12345678901234567890123"));
addSpecification(std::move(std::make_unique<Specification>( addSpecification(new Specification(
"UA", 29, "F25", "UA", 29, "F25",
"UA511234567890123456789012345"))); "UA511234567890123456789012345"));
} }
namespace { namespace {
@ -393,7 +399,13 @@ bool account_validate(text *iban) {
Validate val; Validate val;
ciban = text_to_cstring(iban); ciban = text_to_cstring(iban);
return val.isValid(std::string(ciban)); elog(DEBUG1, "Evaluating '%s'", ciban);
bool r = val.isValid(std::string(ciban));
elog(DEBUG1, "Result %d", r);
return r;
} }
} }

View File

@ -4,12 +4,13 @@
#include "specification.h" #include "specification.h"
class Validate { class Validate {
public: public:
Validate(); Validate();
~Validate();
bool isValid(std::string arg); bool isValid(std::string arg);
void addSpecification(std::unique_ptr<Specification> specPtr); void addSpecification(Specification* specPtr);
void setSelectedSpecification(std::string countryCode); void setSelectedSpecification(std::string countryCode);
std::map<std::string, std::unique_ptr<Specification>> specifications; std::map<std::string, Specification*> specifications;
std::unique_ptr<Specification> selectedSpec; Specification* selectedSpec;
}; };