22 Commits

Author SHA1 Message Date
0e4c24a23d Update README.md 2024-06-03 13:05:47 +00:00
2e266fa5ee Update dtl/Diff.hpp 2024-06-03 13:03:47 +00:00
988e91555f Update dtl/Diff.hpp 2024-06-03 13:01:48 +00:00
cd45dd4808 v1.20 2022-04-11 20:47:20 +09:00
946dc4cecb test: update googletest. 2022-04-11 09:19:34 +09:00
ebd9a49db9 bugfix: fixed invalid offset in unified format difference when difference is too large. 2022-04-11 09:18:51 +09:00
18e674e4a6 doc: rm travis-ci.org link. 2021-05-31 22:01:33 +09:00
0551c22f5e doc: typo fixed. 2021-04-04 02:46:19 +09:00
32787c066d gitignore: added the new pattern. 2021-04-04 02:44:37 +09:00
ab0b64b43a scons: print sentence is not available in python3. 2021-04-04 02:42:21 +09:00
831aeecf1f Merge pull request #10 from cubicdaiya/switch-github-actions
ci: switch to GitHub Actions.
2021-02-17 23:27:57 +09:00
ebbde693a5 ci: switch to GitHub Actions. 2021-02-17 23:26:09 +09:00
b83e617aab Merge pull request #7 from wlawski/custom-storage
Allow saving SES to provided data storage
2020-09-22 13:37:29 +09:00
ea5975a080 Add strdiff_storage to list of build targets of SCons 2020-09-21 21:25:20 +02:00
ef50138616 Merge pull request #6 from wlawski/custom-change-printer-example-improvement
Make custom change printer example more mature
2020-09-21 15:35:11 +09:00
ca3fa6846a Allow saving SES to provided data storage
It is not always efficient (or possible) to use standard output
streams. Moreover, such generated result may be now further
processed.
2020-09-12 19:50:31 +02:00
afddfbccf6 Make custom change printer example more mature
printers.hpp does not depend anymore on includes or usings order
inside strdiff_cp.cpp file.
2020-09-12 16:47:17 +02:00
6b030d6397 travis-ci: fixed CI failure. 2019-09-29 23:18:04 +09:00
1bcddbf879 Merge pull request #4 from jamesjer/master
test: use python 3 compatible print statements.
2019-09-29 23:15:45 +09:00
61c30c7836 test: use python 3 compatible print statements. 2019-09-16 12:13:18 -06:00
9cf6da7279 doc: fixed link. 2017-07-16 23:33:21 +09:00
45c54b42d3 doc: adjusted indent. 2017-07-16 23:32:29 +09:00
15 changed files with 201 additions and 84 deletions

30
.github/workflows/cpp.yml vendored Normal file
View File

@ -0,0 +1,30 @@
name: C++
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install scons and gtest
run: |
sudo apt-get install -y scons
sudo apt-get install -y cmake scons
wget https://github.com/google/googletest/archive/release-1.11.0.zip
unzip -q release-1.11.0.zip
cd googletest-release-1.11.0
cmake .
make
sudo make install
- name: Build examples
run: |
cd examples
scons
- name: Test
run: |
cd test
scons check

1
.gitignore vendored
View File

@ -9,6 +9,7 @@ examples/intdiff3
examples/patch examples/patch
examples/fpatch examples/fpatch
examples/st2ses examples/st2ses
examples/strdiff_storage
test/strdiff3_test test/strdiff3_test
test/*/*/*_ test/*/*/*_
*.o *.o

View File

@ -1,18 +0,0 @@
language: cpp
compiler:
- gcc
- clang
before_script:
- sudo apt-get install -y cmake
- wget https://github.com/google/googletest/archive/release-1.8.0.zip
- unzip -q release-1.8.0.zip
- cd googletest-release-1.8.0
- cmake .
- make
- sudo make install
- cd ..
script:
- cd examples
- scons
- cd ../test
- scons check

View File

@ -1,3 +1,9 @@
2022-04-11 Tatsuhiko Kubo <cubicdaiya@gmail.com>
* bugfix: fixed invalid offset in unified format difference when difference is too large.
* 1.20 released
2015-05-03 Tatsuhiko Kubo <cubicdaiya@gmail.com> 2015-05-03 Tatsuhiko Kubo <cubicdaiya@gmail.com>
* added some minor changes. * added some minor changes.

View File

@ -1,6 +1,4 @@
# dtl # dtl - forked from [https://github.com/cubicdaiya/dtl](https://github.com/cubicdaiya/dtl)
[![Build Status](https://travis-ci.org/cubicdaiya/dtl.png?branch=master)](https://travis-ci.org/cubicdaiya/dtl)
`dtl` is the diff template library written in C++. The name of template is derived C++'s Template. `dtl` is the diff template library written in C++. The name of template is derived C++'s Template.
@ -253,7 +251,7 @@ dtl::Diff<elem, sequence> d(A, B);
d.compose(); d.compose();
d.composeUnifiedHunks() d.composeUnifiedHunks()
string s1(A); string s1(A);
string s2 = d.UniPatch(s1); string s2 = d.uniPatch(s1);
``` ```
When the above code is run, s2 becomes "abd". When the above code is run, s2 becomes "abd".

View File

@ -67,6 +67,8 @@ namespace dtl {
bool editDistanceOnly; bool editDistanceOnly;
uniHunkVec uniHunks; uniHunkVec uniHunks;
comparator cmp; comparator cmp;
long long ox;
long long oy;
public : public :
Diff () {} Diff () {}
@ -162,7 +164,7 @@ namespace dtl {
return trivial; return trivial;
} }
void enableTrivial () const { void enableTrivial () {
this->trivial = true; this->trivial = true;
} }
@ -260,7 +262,8 @@ namespace dtl {
if (isHuge()) { if (isHuge()) {
pathCordinates.reserve(MAX_CORDINATES_SIZE); pathCordinates.reserve(MAX_CORDINATES_SIZE);
} }
ox = 0;
oy = 0;
long long p = -1; long long p = -1;
fp = new long long[M + N + 3]; fp = new long long[M + N + 3];
fill(&fp[0], &fp[M + N + 3], -1); fill(&fp[0], &fp[M + N + 3], -1);
@ -280,7 +283,7 @@ namespace dtl {
editDistance += static_cast<long long>(delta) + 2 * p; editDistance += static_cast<long long>(delta) + 2 * p;
long long r = path[delta+offset]; long long r = path[delta+offset];
P cordinate; P cordinate{};
editPathCordinates epc(0); editPathCordinates epc(0);
// recording edit distance only // recording edit distance only
@ -341,6 +344,15 @@ namespace dtl {
for_each (ses_v.begin (), ses_v.end(), PT < sesElem, stream > (out)); for_each (ses_v.begin (), ses_v.end(), PT < sesElem, stream > (out));
} }
/**
* store difference between A and B as an SES with custom storage
*/
template < typename storedData, template < typename SEET, typename STRT > class ST >
void storeSES(storedData& sd) const {
sesElemVec ses_v = ses.getSequence();
for_each(ses_v.begin(), ses_v.end(), ST < sesElem, storedData >(sd));
}
/** /**
* print difference between A and B in the Unified Format * print difference between A and B in the Unified Format
*/ */
@ -549,6 +561,8 @@ namespace dtl {
trivial = false; trivial = false;
editDistanceOnly = false; editDistanceOnly = false;
fp = NULL; fp = NULL;
ox = 0;
oy = 0;
} }
/** /**
@ -586,18 +600,18 @@ namespace dtl {
while(px_idx < v[i].x || py_idx < v[i].y) { while(px_idx < v[i].x || py_idx < v[i].y) {
if (v[i].y - v[i].x > py_idx - px_idx) { if (v[i].y - v[i].x > py_idx - px_idx) {
if (!wasSwapped()) { if (!wasSwapped()) {
ses.addSequence(*y, 0, y_idx, SES_ADD); ses.addSequence(*y, 0, y_idx + oy, SES_ADD);
} else { } else {
ses.addSequence(*y, y_idx, 0, SES_DELETE); ses.addSequence(*y, y_idx + oy, 0, SES_DELETE);
} }
++y; ++y;
++y_idx; ++y_idx;
++py_idx; ++py_idx;
} else if (v[i].y - v[i].x < py_idx - px_idx) { } else if (v[i].y - v[i].x < py_idx - px_idx) {
if (!wasSwapped()) { if (!wasSwapped()) {
ses.addSequence(*x, x_idx, 0, SES_DELETE); ses.addSequence(*x, x_idx + ox, 0, SES_DELETE);
} else { } else {
ses.addSequence(*x, 0, x_idx, SES_ADD); ses.addSequence(*x, 0, x_idx + ox, SES_ADD);
} }
++x; ++x;
++x_idx; ++x_idx;
@ -605,10 +619,10 @@ namespace dtl {
} else { } else {
if (!wasSwapped()) { if (!wasSwapped()) {
lcs.addSequence(*x); lcs.addSequence(*x);
ses.addSequence(*x, x_idx, y_idx, SES_COMMON); ses.addSequence(*x, x_idx + ox, y_idx + oy, SES_COMMON);
} else { } else {
lcs.addSequence(*y); lcs.addSequence(*y);
ses.addSequence(*y, y_idx, x_idx, SES_COMMON); ses.addSequence(*y, y_idx + oy, x_idx + ox, SES_COMMON);
} }
++x; ++x;
++y; ++y;
@ -649,6 +663,8 @@ namespace dtl {
fp = new long long[M + N + 3]; fp = new long long[M + N + 3];
fill(&fp[0], &fp[M + N + 3], -1); fill(&fp[0], &fp[M + N + 3], -1);
fill(path.begin(), path.end(), -1); fill(path.begin(), path.end(), -1);
ox = x_idx - 1;
oy = y_idx - 1;
return false; return false;
} }
return true; return true;

View File

@ -119,6 +119,20 @@ namespace dtl {
stream& out_; stream& out_;
}; };
/**
* storage class template
*/
template <typename sesElem, typename storedData >
class Storage
{
public:
Storage(storedData& sd) : storedData_(sd) {}
virtual ~Storage() {}
virtual void operator() (const sesElem& se) const = 0;
protected:
storedData& storedData_;
};
/** /**
* compare class template * compare class template
*/ */

View File

@ -63,7 +63,7 @@ namespace dtl {
/** /**
* version string * version string
*/ */
const string version = "1.19"; const string version = "1.20";
/** /**
* type of edit for SES * type of edit for SES

View File

@ -15,13 +15,13 @@ if os.sys.platform != "win32":
conf = Configure(env); conf = Configure(env);
if not conf.CheckCXX(): if not conf.CheckCXX():
print "The C++ compiler is not installed!" print("The C++ compiler is not installed!")
Exit(1) Exit(1)
libs = ['stdc++'] libs = ['stdc++']
for lib in libs: for lib in libs:
if not conf.CheckLib(lib): if not conf.CheckLib(lib):
print "library " + lib + " not installed!" print("library " + lib + " not installed!")
Exit(1) Exit(1)
conf.Finish() conf.Finish()
@ -37,6 +37,7 @@ targets = { 'strdiff' : ['strdiff.cpp', 'common.cpp'], # diff between two
'fpatch' : ['fpatch.cpp', 'common.cpp'], # file patch program using dtl 'fpatch' : ['fpatch.cpp', 'common.cpp'], # file patch program using dtl
'st2ses' : ['st2ses.cpp', 'common.cpp'], # convert SES format file to SES instance 'st2ses' : ['st2ses.cpp', 'common.cpp'], # convert SES format file to SES instance
'strdiff_cp' : ['strdiff_cp.cpp', 'common.cpp'], # diff between two string sequences with custom printer 'strdiff_cp' : ['strdiff_cp.cpp', 'common.cpp'], # diff between two string sequences with custom printer
'strdiff_storage' : ['strdiff_storage.cpp', 'common.cpp'], # diff between two string sequences with custom storage
} }
[ env.Program(target, targets[target]) for target in targets ] [ env.Program(target, targets[target]) for target in targets ]

View File

@ -1,23 +1,25 @@
#ifndef DTL_PRINTERS #ifndef DTL_PRINTERS
#define DTL_PRINTERS #define DTL_PRINTERS
#include <dtl/dtl.hpp>
template <typename sesElem, typename stream = ostream > template <typename sesElem, typename stream = ostream >
class customChangePrinter : public Printer < sesElem, stream > class customChangePrinter : public dtl::Printer < sesElem, stream >
{ {
public : public :
customChangePrinter () : Printer < sesElem, stream > () {} customChangePrinter () : dtl::Printer < sesElem, stream > () {}
customChangePrinter (stream& out) : Printer < sesElem, stream > (out) {} customChangePrinter (stream& out) : dtl::Printer < sesElem, stream > (out) {}
~customChangePrinter () {} ~customChangePrinter () {}
void operator() (const sesElem& se) const { void operator() (const sesElem& se) const {
switch (se.second.type) { switch (se.second.type) {
case SES_ADD: case dtl::SES_ADD:
this->out_ << "Add: " << se.first << endl; this->out_ << "Add: " << se.first << std::endl;
break; break;
case SES_DELETE: case dtl::SES_DELETE:
this->out_ << "Delete: " << se.first << endl; this->out_ << "Delete: " << se.first << std::endl;
break; break;
case SES_COMMON: case dtl::SES_COMMON:
this->out_ << "Common: " << se.first << endl; this->out_ << "Common: " << se.first << std::endl;
break; break;
} }
} }

27
examples/storage.hpp Normal file
View File

@ -0,0 +1,27 @@
#ifndef DTL_STORAGE
#define DTL_STORAGE
#include <dtl/dtl.hpp>
template <typename sesElem, typename storedData >
class CustomStorage : public dtl::Storage < sesElem, storedData >
{
public :
CustomStorage(storedData& sd) : dtl::Storage < sesElem, storedData > (sd) {}
~CustomStorage() {}
void operator() (const sesElem& se) const {
switch (se.second.type) {
case dtl::SES_ADD:
this->storedData_ = this->storedData_ + "Add: " + se.first + "\n";
break;
case dtl::SES_DELETE:
this->storedData_ = this->storedData_ + "Delete: " + se.first + "\n";
break;
case dtl::SES_COMMON:
this->storedData_ = this->storedData_ + "Common: " + se.first + "\n";
break;
}
}
};
#endif // DTL_STORAGE

View File

@ -1,19 +1,14 @@
#include <dtl/dtl.hpp> #include <dtl/dtl.hpp>
#include "common.hpp" #include "common.hpp"
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include "printers.hpp"
using namespace std; using namespace std;
using dtl::Diff; using dtl::Diff;
using dtl::SES_ADD;
using dtl::SES_DELETE;
using dtl::SES_COMMON;
using dtl::Printer;
#include "printers.hpp"
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){

View File

@ -0,0 +1,38 @@
#include <dtl/dtl.hpp>
#include "common.hpp"
#include <iostream>
#include <string>
#include "storage.hpp"
using namespace std;
using dtl::Diff;
int main(int argc, char *argv[]){
if (isFewArgs(argc)) {
cerr << "Too few arguments." << endl;
return -1;
}
typedef char elem;
typedef string sequence;
sequence A(argv[1]);
sequence B(argv[2]);
Diff< elem, sequence > d(A, B);
d.compose();
// Shortest Edit Script
cout << "SES" << endl;
string result;
d.storeSES < string, CustomStorage > (result);
cout << result;
return 0;
}

View File

@ -35,6 +35,7 @@ protected :
cases.push_back(createCase("abcdefq3wefarhgorequgho4euhfteowauhfwehogfewrquhoi23hroewhoahfotrhguoiewahrgqqabcdef", cases.push_back(createCase("abcdefq3wefarhgorequgho4euhfteowauhfwehogfewrquhoi23hroewhoahfotrhguoiewahrgqqabcdef",
"3abcdef4976fd86ouofita67t85r876e5e746578tgliuhopoqqabcdef")); // 8 "3abcdef4976fd86ouofita67t85r876e5e746578tgliuhopoqqabcdef")); // 8
cases.push_back(createCase("abcqqqeqqqccc", "abdqqqeqqqddd")); // 9 cases.push_back(createCase("abcqqqeqqqccc", "abdqqqeqqqddd")); // 9
cases.push_back(createCase("aaaaaaaaaaaaa>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>aaaadsafabcaaaaaaaaaaaaaaaaaaewaaabdaaaaaabbb", "aaaaaaaaaaaaaaadasfdsafsadasdafbaaaaaaaaaaaaaaaaaeaaaaaaaaaae&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&saaabcaaaaaaccc")); // 10
} }
void TearDown () {} void TearDown () {}
@ -96,3 +97,8 @@ TEST_F (Patchtest, patch_test9) {
ASSERT_EQ(cases[9].B, cases[9].diff.patch(cases[9].A)); ASSERT_EQ(cases[9].B, cases[9].diff.patch(cases[9].A));
ASSERT_EQ(cases[9].B, cases[9].diff.uniPatch(cases[9].A)); ASSERT_EQ(cases[9].B, cases[9].diff.uniPatch(cases[9].A));
} }
TEST_F (Patchtest, patch_test10) {
ASSERT_EQ(cases[10].B, cases[10].diff.patch(cases[10].A));
ASSERT_EQ(cases[10].B, cases[10].diff.uniPatch(cases[10].A));
}

View File

@ -11,18 +11,19 @@ def path_chomp(path):
env = Environment( env = Environment(
CPPFLAGS=['-Wall', '-O2'], CPPFLAGS=['-Wall', '-O2'],
CPPPATH=['..'], CPPPATH=['..'],
CXXFLAGS="-std=c++11",
) )
conf = Configure(env); conf = Configure(env);
if not conf.CheckCXX(): if not conf.CheckCXX():
print "c++ compiler is not installed!" print("c++ compiler is not installed!")
Exit(1) Exit(1)
libs = ['stdc++', 'pthread', 'gtest'] libs = ['stdc++', 'pthread', 'gtest']
for lib in libs: for lib in libs:
if not conf.CheckLib(lib): if not conf.CheckLib(lib):
print "library " + lib + " not installed!" print("library " + lib + " not installed!")
Exit(1) Exit(1)
conf.Finish() conf.Finish()