Common: Added liѕtDiff template function

This commit is contained in:
Paul Beckingham 2015-12-22 08:45:40 -05:00
parent 83d7134d64
commit f637a10078
4 changed files with 117 additions and 1 deletions

View file

@ -70,5 +70,45 @@ const std::string format (const std::string& fmt, Args... args)
return format (1, fmt, args...);
}
// List operations.
template <class T> void listDiff (
const T& left, const T& right, T& leftOnly, T& rightOnly)
{
leftOnly.clear ();
rightOnly.clear ();
for (unsigned int l = 0; l < left.size (); ++l)
{
bool found = false;
for (unsigned int r = 0; r < right.size (); ++r)
{
if (left[l] == right[r])
{
found = true;
break;
}
}
if (!found)
leftOnly.push_back (left[l]);
}
for (unsigned int r = 0; r < right.size (); ++r)
{
bool found = false;
for (unsigned int l = 0; l < left.size (); ++l)
{
if (left[l] == right[r])
{
found = true;
break;
}
}
if (!found)
rightOnly.push_back (right[r]);
}
}
#endif
////////////////////////////////////////////////////////////////////////////////

1
test/.gitignore vendored
View file

@ -2,6 +2,7 @@ all.log
color.t
fs.t
lexer.t
list.t
rx.t
text.t
utf8.t

View file

@ -9,7 +9,7 @@ include_directories (${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/test
${TIMEW_INCLUDE_DIRS})
set (test_SRCS color.t fs.t lexer.t rx.t text.t utf8.t)
set (test_SRCS color.t fs.t lexer.t list.t rx.t text.t utf8.t)
add_custom_target (test ./run_all --verbose
DEPENDS ${test_SRCS} timew_executable

75
test/list.t.cpp Normal file
View file

@ -0,0 +1,75 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2006 - 2015, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// http://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <cmake.h>
#include <text.h>
#include <test.h>
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////////////
int main (int, char**)
{
UnitTest t (8);
// 1,2,3 <=> 2,3,4
std::vector <std::string> string_one {"1", "2", "3"};
std::vector <std::string> string_two {"2", "3", "4"};
std::vector <std::string> string_three {"2", "3", "4"};
std::vector <std::string> string_four;
// What are the differences?
std::vector<std::string> string_leftOnly;
std::vector<std::string> string_rightOnly;
listDiff (string_one, string_two, string_leftOnly, string_rightOnly);
t.is ((int) string_leftOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = 1<-");
t.is (string_leftOnly[0], "1", "std::string (1,2,3) <=> (2,3,4) = 1<-");
t.is ((int) string_rightOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = ->4");
t.is (string_rightOnly[0], "4", "std::string (1,2,3) <=> (2,3,4) = ->4");
// Now do it all again, with integers.
// 1,2,3 <=> 2,3,4
std::vector <int> int_one {1, 2, 3};
std::vector <int> int_two {2, 3, 4};
std::vector <int> int_three {2, 3, 4};
std::vector <int> int_four;
// What are the differences?
std::vector<int> int_leftOnly;
std::vector<int> int_rightOnly;
listDiff (int_one, int_two, int_leftOnly, int_rightOnly);
t.is ((int) int_leftOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = 1<-");
t.is (int_leftOnly[0], "1", "int (1,2,3) <=> (2,3,4) = 1<-");
t.is ((int) int_rightOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = ->4");
t.is (int_rightOnly[0], "4", "int (1,2,3) <=> (2,3,4) = ->4");
return 0;
}
////////////////////////////////////////////////////////////////////////////////