Compare commits
13 Commits
gtest-upda
...
switch-git
Author | SHA1 | Date | |
---|---|---|---|
ebbde693a5 | |||
b83e617aab | |||
ea5975a080 | |||
ef50138616 | |||
ca3fa6846a | |||
afddfbccf6 | |||
6b030d6397 | |||
1bcddbf879 | |||
61c30c7836 | |||
9cf6da7279 | |||
45c54b42d3 | |||
33a68d8c2d | |||
424ab0dbb7 |
30
.github/workflows/cpp.yml
vendored
Normal file
30
.github/workflows/cpp.yml
vendored
Normal 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.8.0.zip
|
||||
unzip -q release-1.8.0.zip
|
||||
cd googletest-release-1.8.0
|
||||
cmake .
|
||||
make
|
||||
sudo make install
|
||||
|
||||
- name: Build examples
|
||||
run: |
|
||||
cd examples
|
||||
scons
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
cd test
|
||||
scons check
|
18
.travis.yml
18
.travis.yml
@ -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
|
48
README.md
48
README.md
@ -8,30 +8,30 @@
|
||||
|
||||
* [Features](#features)
|
||||
* [Getting started](#getting-started)
|
||||
* [Compare two strings](#compare-two-strings)
|
||||
* [Compare two data has arbitrary type](#compare-two-data-has-arbitrary-type)
|
||||
* [Merge three sequences](#merge-three-sequences)
|
||||
* [Patch function](#patch-function)
|
||||
* [Difference as Unified Format](#difference-as-unified-format)
|
||||
* [Compare large sequences](#compare-large-sequences)
|
||||
* [Unserious difference](#unserious-difference)
|
||||
* [Calculate only Edit Distance](#calculate-only-edit-distance)
|
||||
* [Compare two strings](#compare-two-strings)
|
||||
* [Compare two data has arbitrary type](#compare-two-data-has-arbitrary-type)
|
||||
* [Merge three sequences](#merge-three-sequences)
|
||||
* [Patch function](#patch-function)
|
||||
* [Difference as Unified Format](#difference-as-unified-format)
|
||||
* [Compare large sequences](#compare-large-sequences)
|
||||
* [Unserious difference](#unserious-difference)
|
||||
* [Calculate only Edit Distance](#calculate-only-edit-distance)
|
||||
* [Algorithm](#algorithm)
|
||||
* [Computational complexity](#computational-complexity)
|
||||
* [Comparison when difference between two sequences is very large](#comparison-when-difference-between-two-sequences-is-very-large)
|
||||
* [Implementations with various programming languages](#implementations-with-various-programming-languages)
|
||||
* [Computational complexity](#computational-complexity)
|
||||
* [Comparison when difference between two sequences is very large](#comparison-when-difference-between-two-sequences-is-very-large)
|
||||
* [Implementations with various programming languages](#implementations-with-various-programming-languages)
|
||||
* [Examples](#examples)
|
||||
* [strdiff](#strdiff)
|
||||
* [intdiff](#intdiff)
|
||||
* [unidiff](#unidiff)
|
||||
* [unistrdiff](#unistrdiff)
|
||||
* [strdiff3](#strdiff3)
|
||||
* [intdiff3](#intdiff3)
|
||||
* [patch](#patch)
|
||||
* [fpatch](#fpatch)
|
||||
* [strdiff](#strdiff)
|
||||
* [intdiff](#intdiff)
|
||||
* [unidiff](#unidiff)
|
||||
* [unistrdiff](#unistrdiff)
|
||||
* [strdiff3](#strdiff3)
|
||||
* [intdiff3](#intdiff3)
|
||||
* [patch](#patch)
|
||||
* [fpatch](#fpatch)
|
||||
* [Running tests](#running-tests)
|
||||
* [Building test programs](#building-test-programs)
|
||||
* [Running test programs](#running-test-programs)
|
||||
* [Building test programs](#building-test-programs)
|
||||
* [Running test programs](#running-test-programs)
|
||||
* [Old commit histories](#old-commit-histories)
|
||||
* [License](#license)
|
||||
|
||||
@ -650,14 +650,14 @@ $
|
||||
|
||||
# Running tests
|
||||
|
||||
`dtl` uses [googletest](http://code.google.com/p/googletest/) and [SCons](http://www.scons.org/) with testing dtl-self.
|
||||
`dtl` uses [googletest](https://github.com/google/googletest) and [SCons](http://www.scons.org/) with testing dtl-self.
|
||||
|
||||
# Building test programs
|
||||
|
||||
If you build test programs for `dtl`, run `scons` in test direcotry.
|
||||
|
||||
```bash
|
||||
$ GTEST_ROOT=${gtest_root_dir} scons
|
||||
$ scons
|
||||
```
|
||||
|
||||
# Running test programs
|
||||
@ -665,7 +665,7 @@ $ GTEST_ROOT=${gtest_root_dir} scons
|
||||
If you run all tests for `dtl`, run 'scons check' in test direcotry. (it is necessary that gtest is compiled)
|
||||
|
||||
```bash
|
||||
$ GTEST_ROOT=${gtest_root_dir} scons check
|
||||
$ scons check
|
||||
```
|
||||
|
||||
If you run sectional tests, you may exeucte `dtl_test` directly after you run `scons`.
|
||||
|
@ -340,6 +340,15 @@ namespace dtl {
|
||||
sesElemVec ses_v = ses.getSequence ();
|
||||
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
|
||||
|
@ -118,6 +118,20 @@ namespace dtl {
|
||||
private :
|
||||
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
|
||||
|
@ -26,17 +26,18 @@ for lib in libs:
|
||||
|
||||
conf.Finish()
|
||||
|
||||
targets = { 'strdiff' : ['strdiff.cpp', 'common.cpp'], # diff between two string sequences
|
||||
'intdiff' : ['intdiff.cpp'], # diff between two integer sequences
|
||||
'unidiff' : ['unidiff.cpp', 'common.cpp'], # unified diff between two files
|
||||
'unistrdiff' : ['unistrdiff.cpp', 'common.cpp'], # unified diff between two strings
|
||||
'bdiff' : ['bdiff.cpp', 'common.cpp'], # diff between two byte sequences
|
||||
'strdiff3' : ['strdiff3.cpp', 'common.cpp'], # three-way string diff program using dtl
|
||||
'intdiff3' : ['intdiff3.cpp'], # three-way integer diff program using dtl
|
||||
'patch' : ['patch.cpp', 'common.cpp'], # string 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
|
||||
'strdiff_cp' : ['strdiff_cp.cpp', 'common.cpp'], # diff between two string sequences with custom printer
|
||||
targets = { 'strdiff' : ['strdiff.cpp', 'common.cpp'], # diff between two string sequences
|
||||
'intdiff' : ['intdiff.cpp'], # diff between two integer sequences
|
||||
'unidiff' : ['unidiff.cpp', 'common.cpp'], # unified diff between two files
|
||||
'unistrdiff' : ['unistrdiff.cpp', 'common.cpp'], # unified diff between two strings
|
||||
'bdiff' : ['bdiff.cpp', 'common.cpp'], # diff between two byte sequences
|
||||
'strdiff3' : ['strdiff3.cpp', 'common.cpp'], # three-way string diff program using dtl
|
||||
'intdiff3' : ['intdiff3.cpp'], # three-way integer diff program using dtl
|
||||
'patch' : ['patch.cpp', 'common.cpp'], # string 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
|
||||
'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 ]
|
||||
|
@ -1,23 +1,25 @@
|
||||
#ifndef DTL_PRINTERS
|
||||
#define DTL_PRINTERS
|
||||
|
||||
#include <dtl/dtl.hpp>
|
||||
|
||||
template <typename sesElem, typename stream = ostream >
|
||||
class customChangePrinter : public Printer < sesElem, stream >
|
||||
class customChangePrinter : public dtl::Printer < sesElem, stream >
|
||||
{
|
||||
public :
|
||||
customChangePrinter () : Printer < sesElem, stream > () {}
|
||||
customChangePrinter (stream& out) : Printer < sesElem, stream > (out) {}
|
||||
customChangePrinter () : dtl::Printer < sesElem, stream > () {}
|
||||
customChangePrinter (stream& out) : dtl::Printer < sesElem, stream > (out) {}
|
||||
~customChangePrinter () {}
|
||||
void operator() (const sesElem& se) const {
|
||||
switch (se.second.type) {
|
||||
case SES_ADD:
|
||||
this->out_ << "Add: " << se.first << endl;
|
||||
case dtl::SES_ADD:
|
||||
this->out_ << "Add: " << se.first << std::endl;
|
||||
break;
|
||||
case SES_DELETE:
|
||||
this->out_ << "Delete: " << se.first << endl;
|
||||
case dtl::SES_DELETE:
|
||||
this->out_ << "Delete: " << se.first << std::endl;
|
||||
break;
|
||||
case SES_COMMON:
|
||||
this->out_ << "Common: " << se.first << endl;
|
||||
case dtl::SES_COMMON:
|
||||
this->out_ << "Common: " << se.first << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
27
examples/storage.hpp
Normal file
27
examples/storage.hpp
Normal 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
|
@ -1,19 +1,14 @@
|
||||
|
||||
#include <dtl/dtl.hpp>
|
||||
#include "common.hpp"
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include "printers.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
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[]){
|
||||
|
||||
|
38
examples/strdiff_storage.cpp
Normal file
38
examples/strdiff_storage.cpp
Normal 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;
|
||||
}
|
@ -16,13 +16,13 @@ env = Environment(
|
||||
conf = Configure(env);
|
||||
|
||||
if not conf.CheckCXX():
|
||||
print "c++ compiler is not installed!"
|
||||
print("c++ compiler is not installed!")
|
||||
Exit(1)
|
||||
|
||||
libs = ['stdc++', 'pthread', 'gtest']
|
||||
for lib in libs:
|
||||
if not conf.CheckLib(lib):
|
||||
print "library " + lib + " not installed!"
|
||||
print("library " + lib + " not installed!")
|
||||
Exit(1)
|
||||
|
||||
conf.Finish()
|
||||
|
Reference in New Issue
Block a user