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.
This commit is contained in:
parent
6b030d6397
commit
ca3fa6846a
@ -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
|
||||
|
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
|
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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user