int main(int argc, char *argv[]) { std_inf inf; size_t result = 0; lang_conv lc1("UTF-8", "UCS-2LE"); lang_conv lc2("UCS-2LE", "UTF-8"); if (true != lc1.ok()) { std::cout << "lc1 create fail" << std::endl; return 1; } if (true != lc2.ok()) { std::cout << "lc2 create fail" << std::endl; return 1; } result = lc1.conv(test_data, strlen(test_data)); if (true != lc1.ok()) { std::cout << "lc1 conv fail" << std::endl; return 1; } std::cout << "result = " << result << "data len = " << lc1.len() << std::endl; result = lc2.conv(lc1.data(), lc1.len()); if (true != lc2.ok()) { std::cout << "lc2 conv fail" << std::endl; return 1; } std::cout << "result = " << result << "to = " << lc2.data() << std::endl; return 0; }
void LocaleTests::testDefaultLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8" ); QVERIFY( !lc.isEmpty() ); QCOMPARE( lc.language(), "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); LocaleConfiguration lc2( "de_DE.UTF-8" ); QVERIFY( !lc2.isEmpty() ); QCOMPARE( lc2.language(), "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); }
bool RS_ActionDrawCircleTan3::getData(){ if(getStatus() != SetCircle3) return false; //find the nearest circle int i=0; for(i=0;i<circles.size();i++) if(circles[i]->rtti() == RS2::EntityLine) break; candidates.clear(); if(i<circles.size() && circles[i]->rtti() == RS2::EntityLine){ LC_Quadratic lc0(circles[i],circles[(i+1)%3]); LC_Quadratic lc1(circles[i],circles[(i+2)%3]); auto&& sol=LC_Quadratic::getIntersection(lc0,lc1); double d; //line passes circle center, need a second parabola as the image of the line for(int j=1;j<=2;j++){ if(circles[(i+j)%3]->rtti() == RS2::EntityCircle){ circles[i]->getNearestPointOnEntity(circles[(i+j)%3]->getCenter(), false,&d); if(d<RS_TOLERANCE) { LC_Quadratic lc2(circles[i],circles[(i+j)%3], true); sol.appendTo(LC_Quadratic::getIntersection(lc2,lc1)); } } } for(size_t j=0;j<sol.size();j++){ circles[i]->getNearestPointOnEntity(sol[j],false,&d); RS_CircleData data(sol[j],d); // DEBUG_HEADER(); // std::cout<<sol[j]<<" r="<<d<<std::endl; if(circles[(i+1)%3]->isTangent(data)==false) continue; if(circles[(i+2)%3]->isTangent(data)==false) continue; candidates<<RS_Circle(NULL,data); } }else{ RS_Circle c(NULL,cData); candidates=c.createTan3(circles); } valid = ( candidates.size() >0); return valid; }
void LocaleTests::testSplitLocaleConfiguration() { LocaleConfiguration lc( "en_US.UTF-8", "de_DE.UTF-8" ); QVERIFY( !lc.isEmpty() ); QCOMPARE( lc.language(), "en_US.UTF-8" ); QCOMPARE( lc.toBcp47(), "en" ); QCOMPARE( lc.lc_numeric, QStringLiteral( "de_DE.UTF-8" ) ); LocaleConfiguration lc2( "de_DE.UTF-8", "da_DK.UTF-8" ); QVERIFY( !lc2.isEmpty() ); QCOMPARE( lc2.language(), "de_DE.UTF-8" ); QCOMPARE( lc2.toBcp47(), "de" ); QCOMPARE( lc2.lc_numeric, "da_DK.UTF-8" ); LocaleConfiguration lc3( "da_DK.UTF-8", "de_DE.UTF-8" ); QVERIFY( !lc3.isEmpty() ); QCOMPARE( lc3.toBcp47(), "da" ); QCOMPARE( lc3.lc_numeric, "de_DE.UTF-8" ); }
bool RS_ActionDrawCircleTan3::getData(){ if(getStatus() != SetCircle3) return false; //find the nearest circle int i=0; for(;i<circles.size();++i) if(circles[i]->rtti() == RS2::EntityLine) break; candidates.clear(); const int i1=(i+1)%3; const int i2=(i+2)%3; if(i<circles.size() && circles[i]->rtti() == RS2::EntityLine){ LC_Quadratic lc0(circles[i],circles[i1],false); LC_Quadratic lc01(circles[i],circles[i1],true); LC_Quadratic lc1; RS_VectorSolutions sol; //detect degenerate case two circles with the same radius if(circles[i1]->rtti()== RS2::EntityCircle && circles[i2]->rtti()== RS2::EntityCircle ){ RS_Circle* c1=static_cast<RS_Circle*>(circles[i1]); RS_Circle* c2=static_cast<RS_Circle*>(circles[i2]); if(fabs(fabs(c1->getRadius())-fabs(c2->getRadius()))<RS_TOLERANCE){ //degenerate const RS_Vector p0=(c1->getCenter()+c2->getCenter())*0.5; const RS_Vector p1=p0 + (c1->getCenter() - p0).rotate(0.5*M_PI); lc1=RS_Line(NULL, RS_LineData(p0,p1 )).getQuadratic(); sol=LC_Quadratic::getIntersection(lc0,lc1); sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); lc1=RS_Line(NULL, RS_LineData(c1->getCenter(),c1->getCenter())).getQuadratic(); sol.appendTo(LC_Quadratic::getIntersection(lc0,lc1)); sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); } } if(sol.size()==0) { switch(circles[i2]->rtti()){ case RS2::EntityCircle: lc1=LC_Quadratic(circles[i],circles[i2], true); sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); if(circles[i1]->rtti()== RS2::EntityCircle ) sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); //there's no break, because the default part would be run for circles as well default: lc1=LC_Quadratic(circles[i],circles[i2]); sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); if(circles[i1]->rtti()== RS2::EntityCircle ) sol.appendTo(LC_Quadratic::getIntersection(lc01,lc1)); } } double d; //line passes circle center, need a second parabola as the image of the line for(int j=1;j<=2;j++){ if(circles[(i+j)%3]->rtti() == RS2::EntityCircle){ circles[i]->getNearestPointOnEntity(circles[(i+j)%3]->getCenter(), false,&d); if(d<RS_TOLERANCE) { LC_Quadratic lc2(circles[i],circles[(i+j)%3], true); sol.appendTo(LC_Quadratic::getIntersection(lc2,lc1)); } } } //clean up duplicate and invalid RS_VectorSolutions sol1; for(size_t j=0; j<sol.size(); ++j){ const RS_Vector&& vp=sol.at(j); if(vp.magnitude()>RS_MAXDOUBLE) continue; if(sol1.size()) if(sol1.getClosestDistance(vp)<RS_TOLERANCE) continue; sol1.push_back(vp); } for(size_t j=0;j<sol1.size();j++){ circles[i]->getNearestPointOnEntity(sol1[j],false,&d); RS_CircleData data(sol1[j],d); if(circles[(i+1)%3]->isTangent(data)==false) continue; if(circles[(i+2)%3]->isTangent(data)==false) continue; candidates<<RS_Circle(NULL,data); } }else{ RS_Circle c(NULL,cData); candidates=c.createTan3(circles); } valid = ( candidates.size() >0); return valid; }
bool RS_ActionDrawCircleTan3::getData(){ if(getStatus() != SetCircle3) return false; //find the nearest circle size_t i=0; size_t const countLines=std::count_if(circles.begin(), circles.end(), [](RS_AtomicEntity* e)->bool { return e->rtti()==RS2::EntityLine; }); for(;i<circles.size();++i) if(circles[i]->rtti() == RS2::EntityLine) break; candidates.clear(); size_t i1=(i+1)%3; size_t i2=(i+2)%3; if(i<circles.size() && circles[i]->rtti() == RS2::EntityLine){ //one or more lines LC_Quadratic lc0(circles[i],circles[i1],false); LC_Quadratic lc1; RS_VectorSolutions sol; //detect degenerate case two circles with the same radius switch(countLines){ default: case 0: //this should not happen assert(false); case 1: //1 line, two circles { for(unsigned k=0; k<4; ++k){ //loop through all mirroring cases lc1=LC_Quadratic(circles[i],circles[i1], k & 1u); LC_Quadratic lc2=LC_Quadratic(circles[i],circles[i2], k & 2u); sol.appendTo(LC_Quadratic::getIntersection(lc1,lc2)); } } break; case 2: //2 lines, one circle { if(circles[i2]->rtti()==RS2::EntityLine){ std::swap(i1, i2); } //i2 is circle for(unsigned k=0; k<4; ++k){ //loop through all mirroring cases lc1=LC_Quadratic(circles[i2],circles[i], k & 1u); LC_Quadratic lc2=LC_Quadratic(circles[i2],circles[i1], k & 2u); sol.appendTo(LC_Quadratic::getIntersection(lc1,lc2)); } } break; case 3: //3 lines { lc0=circles[i]->getQuadratic(); lc1=circles[i1]->getQuadratic(); auto lc2=circles[i2]->getQuadratic(); //attempt to have intersections (lc0, lc1), (lc0, lc2) auto sol1=LC_Quadratic::getIntersection(lc0,lc1); if(sol1.size()<1) { std::swap(lc0, lc2); std::swap(i, i2); } sol1=LC_Quadratic::getIntersection(lc0,lc2); if(sol1.size()<1) { std::swap(lc0, lc1); std::swap(i, i1); } RS_Line* line0=static_cast<RS_Line*>(circles[i]); RS_Line* line1=static_cast<RS_Line*>(circles[i1]); RS_Line* line2=static_cast<RS_Line*>(circles[i2]); lc0=line0->getQuadratic(); lc1=line1->getQuadratic(); lc2=line2->getQuadratic(); //intersection 0, 1 sol1=LC_Quadratic::getIntersection(lc0,lc1); if(!sol1.size()) { return false; } RS_Vector const v1=sol1.at(0); double angle1=0.5*(line0->getAngle1()+line1->getAngle1()); //intersection 0, 2 sol1=LC_Quadratic::getIntersection(lc0,lc2); double angle2; if(sol1.size()<1) { return false; } angle2=0.5*(line0->getAngle1()+line2->getAngle1()); RS_Vector const& v2=sol1.at(0); //two bisector lines per intersection for(unsigned j=0; j<2; ++j){ RS_Line l1{v1, v1+RS_Vector{angle1}}; for(unsigned j1=0; j1<2; ++j1){ RS_Line l2{v2, v2+RS_Vector{angle2}}; sol.appendTo(RS_Information::getIntersectionLineLine(&l1, &l2)); angle2 += M_PI_2; } angle1 += M_PI_2; } } } double d; //line passes circle center, need a second parabola as the image of the line for(int j=1;j<=2;j++){ if(circles[(i+j)%3]->rtti() == RS2::EntityCircle){ circles[i]->getNearestPointOnEntity(circles[(i+j)%3]->getCenter(), false,&d); if(d<RS_TOLERANCE) { LC_Quadratic lc2(circles[i],circles[(i+j)%3], true); sol.appendTo(LC_Quadratic::getIntersection(lc2,lc1)); } } } //clean up duplicate and invalid RS_VectorSolutions sol1; for(const RS_Vector& vp: sol){ if(vp.magnitude()>RS_MAXDOUBLE) continue; if(sol1.size() && sol1.getClosestDistance(vp)<RS_TOLERANCE) continue; sol1.push_back(vp); } for(auto const& v: sol1){ circles[i]->getNearestPointOnEntity(v,false,&d); std::shared_ptr<RS_CircleData> data(new RS_CircleData(v,d)); if(circles[(i+1)%3]->isTangent(*data)==false) continue; if(circles[(i+2)%3]->isTangent(*data)==false) continue; candidates.push_back(data); } }else{ RS_Circle c(nullptr,*cData); auto solutions=c.createTan3(circles); candidates.clear(); for(const RS_Circle& s: solutions){ candidates.push_back(std::make_shared<RS_CircleData>(s.getData())); } } valid = ( candidates.size() >0); return valid; }
static int load_file(wordic_p p_fdic, wordic_p p_bdic, char *file, wd_attr_p p_attr) { std_inf inf; char * line; std_str revert_word; lang_conv lc("UTF-8", "UCS-2LE"); #if defined(_CONV_TEST_) lang_conv lc2("UCS-2LE", "UTF-8"); #endif // _CONV_TEST_ size_t len0, len1; size_t len; word_splitter words("", std_str(" ",2)); line = (char*)malloc(IN_BUF_SZ); inf.open(file, std_inf::in|std_inf::binary); while (inf.good()) { inf.getline(line, IN_BUF_SZ); if (line[strlen(line)-1] == 0x0a) line[strlen(line)-1] = '\0'; len0 = strlen(line); if (len0 <= 0) continue; if ('#' == line[0]) continue; len = lc.conv(line, len0); words.work_on(std_str(lc.data(), lc.len())); int i = 0; // each element is 2bytes, so when revert the code, it should go with 2 bytes everytime. while (word_splitter::err != words[i]) { revert_word.clear(); //revert_word.resize(words[i].length()); int k = words[i].length() - sizeof(short); int j = 0; while (k >= 0) { revert_word.insert(j, words[i], k, sizeof(short)); k -= sizeof(short); j += sizeof(short); } wordic_add_word(p_fdic, (unsigned short*)words[i].data(), words[i].length()/2, p_attr); wordic_add_word(p_bdic, (unsigned short*)revert_word.data(), revert_word.length()/2, p_attr); i++; } words.debug(); words.clear(); #if defined(_CONV_TEST_) len = lc2.conv(lc.data(), lc.len()); if (len != lc.len()+1) { std::cout << "error or incomplete input" << std::endl; } words.chg_sep(" "); words.work_on(std_str(lc2.data(), lc2.len())); words.debug(); words.clear(); #endif // _CONV_TEST_ } inf.close(); free(line); std::cout << "end" << std::endl; return 0; }