Browse Source
Revert "QA: Add a generic utility tool executable."
Revert "QA: Add a generic utility tool executable."
This reverts commit 502306314e.
pull/13/head
9 changed files with 54 additions and 409 deletions
-
1include/tool/coroutine.h
-
5include/tool/examples/Makefile
-
49include/tool/examples/coroutine_example.cpp
-
8qa/CMakeLists.txt
-
59qa/common_tools/CMakeLists.txt
-
123qa/common_tools/main.cpp
-
10qa/common_tools/tools/coroutines/coroutine_tools.h
-
131qa/common_tools/tools/coroutines/coroutines.cpp
-
77qa/qa_utils/utility_program.h
@ -0,0 +1,49 @@ |
|||||
|
#include <cstdio>
|
||||
|
#include <string>
|
||||
|
|
||||
|
#include <tool/coroutine.h>
|
||||
|
|
||||
|
typedef COROUTINE<int, int> MyCoroutine; |
||||
|
|
||||
|
class MyClass |
||||
|
{ |
||||
|
public: |
||||
|
int CountTo( int n ) |
||||
|
{ |
||||
|
printf( "%s: Coroutine says hi. I will count from 1 to %d and yield each value.\n", |
||||
|
__FUNCTION__, |
||||
|
n ); |
||||
|
|
||||
|
for( int i = 1; i <= n; i++ ) |
||||
|
{ |
||||
|
printf( "%s: Yielding %d\n", __FUNCTION__, i ); |
||||
|
cofunc.Yield( i ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Run() |
||||
|
{ |
||||
|
cofunc = MyCoroutine( this, &MyClass::CountTo ); |
||||
|
printf( "%s: Calling coroutine that will count from 1 to 5.\n", __FUNCTION__ ); |
||||
|
cofunc.Call( 5 ); |
||||
|
|
||||
|
while( cofunc.Running() ) |
||||
|
{ |
||||
|
printf( "%s: Got value: %d\n", __FUNCTION__, cofunc.ReturnValue() ); |
||||
|
cofunc.Resume(); |
||||
|
} |
||||
|
|
||||
|
printf( "%s: Done!\n", __FUNCTION__ ); |
||||
|
} |
||||
|
|
||||
|
MyCoroutine cofunc; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
main() { |
||||
|
MyClass obj; |
||||
|
|
||||
|
obj.Run(); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
@ -1,59 +0,0 @@ |
|||||
# This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
# |
|
||||
# Copyright (C) 2018 KiCad Developers, see CHANGELOG.TXT for contributors. |
|
||||
# |
|
||||
# This program is free software; you can redistribute it and/or |
|
||||
# modify it under the terms of the GNU General Public License |
|
||||
# as published by the Free Software Foundation; either version 2 |
|
||||
# of the License, or (at your option) any later version. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU General Public License for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU General Public License |
|
||||
# along with this program; if not, you may find one here: |
|
||||
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|
||||
# or you may search the http://www.gnu.org website for the version 2 license, |
|
||||
# or you may write to the Free Software Foundation, Inc., |
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
|
|
||||
find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml stc REQUIRED ) |
|
||||
|
|
||||
add_executable( qa_common_tools |
|
||||
|
|
||||
# # stuff from common due to...units? |
|
||||
# ../../common/eda_text.cpp |
|
||||
|
|
||||
# stuff from common which is needed...why? |
|
||||
../../common/colors.cpp |
|
||||
../../common/observable.cpp |
|
||||
|
|
||||
# The main entry point |
|
||||
main.cpp |
|
||||
|
|
||||
tools/coroutines/coroutines.cpp |
|
||||
) |
|
||||
|
|
||||
include_directories( |
|
||||
${CMAKE_SOURCE_DIR} |
|
||||
${CMAKE_SOURCE_DIR}/include |
|
||||
${CMAKE_SOURCE_DIR}/polygon |
|
||||
${INC_AFTER} |
|
||||
) |
|
||||
|
|
||||
target_link_libraries( qa_common_tools |
|
||||
common |
|
||||
legacy_gal |
|
||||
polygon |
|
||||
bitmaps |
|
||||
gal |
|
||||
qa_utils |
|
||||
${wxWidgets_LIBRARIES} |
|
||||
) |
|
||||
|
|
||||
# we need to pretend to be something to appease the units code |
|
||||
target_compile_definitions( qa_common_tools |
|
||||
PRIVATE PCBNEW |
|
||||
) |
|
||||
@ -1,123 +0,0 @@ |
|||||
/*
|
|
||||
* This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
* |
|
||||
* Copyright (C) 2018 KiCad Developers, see CHANGELOG.TXT for contributors. |
|
||||
* |
|
||||
* This program is free software; you can redistribute it and/or |
|
||||
* modify it under the terms of the GNU General Public License |
|
||||
* as published by the Free Software Foundation; either version 2 |
|
||||
* of the License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU General Public License |
|
||||
* along with this program; if not, you may find one here: |
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
||||
* or you may write to the Free Software Foundation, Inc., |
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
*/ |
|
||||
|
|
||||
#include <common.h>
|
|
||||
|
|
||||
#include "tools/coroutines/coroutine_tools.h"
|
|
||||
|
|
||||
#include <wx/cmdline.h>
|
|
||||
|
|
||||
/**
|
|
||||
* List of registered tools. |
|
||||
* |
|
||||
* This is a pretty rudimentary way to register, but for a simple purpose, |
|
||||
* it's effective enough. When you have a new tool, add it to this list. |
|
||||
*/ |
|
||||
const static std::vector<UTILITY_PROGRAM*> known_tools = { |
|
||||
&coroutine_tool, |
|
||||
}; |
|
||||
|
|
||||
|
|
||||
/**
|
|
||||
* Print the names and descriptions of the registered tools |
|
||||
*/ |
|
||||
static void show_tool_list() |
|
||||
{ |
|
||||
for( const auto& tool : known_tools ) |
|
||||
{ |
|
||||
std::cout << tool->m_name << ": \t" << tool->m_desc << std::endl; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
/**
|
|
||||
* Get the utility program that matches a tool name |
|
||||
* @param aName the name to look for |
|
||||
* @return the tool function |
|
||||
*/ |
|
||||
UTILITY_PROGRAM::FUNC* get_program( const std::string& aName ) |
|
||||
{ |
|
||||
for( const auto& tool : known_tools ) |
|
||||
{ |
|
||||
if( tool->m_name == aName ) |
|
||||
return &tool->m_func; |
|
||||
} |
|
||||
|
|
||||
return nullptr; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
void print_usage( char* name ) |
|
||||
{ |
|
||||
std::cout << "Run a utility tool." << std::endl; |
|
||||
|
|
||||
std::cout << "Usage: " << name << " [-h] [-l] [TOOL [TOOL_OPTIONS]]" << std::endl; |
|
||||
|
|
||||
std::cout << " -h show this message and exit." << std::endl |
|
||||
<< " -l print known tools and exit." << std::endl; |
|
||||
|
|
||||
std::cout << std::endl; |
|
||||
std::cout << "Known tools: " << std::endl; |
|
||||
|
|
||||
show_tool_list(); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
int main( int argc, char** argv ) |
|
||||
{ |
|
||||
wxMessageOutput::Set( new wxMessageOutputStderr ); |
|
||||
|
|
||||
// Need at least one parameter
|
|
||||
if( argc < 2 ) |
|
||||
{ |
|
||||
print_usage( argv[0] ); |
|
||||
return RET_CODES::BAD_CMDLINE; |
|
||||
} |
|
||||
|
|
||||
const std::string arg1( argv[1] ); |
|
||||
|
|
||||
if( argc == 2 ) |
|
||||
{ |
|
||||
if( arg1 == "-h" ) |
|
||||
{ |
|
||||
print_usage( argv[0] ); |
|
||||
return RET_CODES::OK; |
|
||||
} |
|
||||
else if( arg1 == "-l" ) |
|
||||
{ |
|
||||
show_tool_list(); |
|
||||
return RET_CODES::OK; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
auto func = get_program( arg1 ); |
|
||||
|
|
||||
if( !func ) |
|
||||
{ |
|
||||
std::cout << "Tool " << arg1 << " not found." << std::endl; |
|
||||
return RET_CODES::UNKNOWN_TOOL; |
|
||||
} |
|
||||
|
|
||||
// pass on the rest of the commands
|
|
||||
return ( *func )( argc - 1, argv + 1 ); |
|
||||
} |
|
||||
@ -1,10 +0,0 @@ |
|||||
|
|
||||
#ifndef COROUTINES_UTILTY_H |
|
||||
#define COROUTINES_UTILTY_H |
|
||||
|
|
||||
#include <utility_program.h> |
|
||||
|
|
||||
/// A tool to test a simple coroutine |
|
||||
extern UTILITY_PROGRAM coroutine_tool; |
|
||||
|
|
||||
#endif |
|
||||
@ -1,131 +0,0 @@ |
|||||
/*
|
|
||||
* This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
* |
|
||||
* Copyright (C) 2018 KiCad Developers, see CHANGELOG.TXT for contributors. |
|
||||
* |
|
||||
* This program is free software; you can redistribute it and/or |
|
||||
* modify it under the terms of the GNU General Public License |
|
||||
* as published by the Free Software Foundation; either version 2 |
|
||||
* of the License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU General Public License |
|
||||
* along with this program; if not, you may find one here: |
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
||||
* or you may write to the Free Software Foundation, Inc., |
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
*/ |
|
||||
|
|
||||
#include "coroutine_tools.h"
|
|
||||
|
|
||||
#include <cstdio>
|
|
||||
#include <string>
|
|
||||
|
|
||||
#include <common.h>
|
|
||||
|
|
||||
#include <tool/coroutine.h>
|
|
||||
|
|
||||
#include <wx/cmdline.h>
|
|
||||
|
|
||||
|
|
||||
typedef COROUTINE<int, int> MyCoroutine; |
|
||||
|
|
||||
class CoroutineExample |
|
||||
{ |
|
||||
public: |
|
||||
CoroutineExample( int aCount ) : m_count( aCount ) |
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
int CountTo( int n ) |
|
||||
{ |
|
||||
printf( "%s: Coroutine says hi. I will count from 1 to %d and yield each value.\n", |
|
||||
__FUNCTION__, n ); |
|
||||
|
|
||||
for( int i = 1; i <= n; i++ ) |
|
||||
{ |
|
||||
printf( "%s: Yielding %d\n", __FUNCTION__, i ); |
|
||||
m_cofunc->KiYield( i ); |
|
||||
} |
|
||||
|
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
void Run() |
|
||||
{ |
|
||||
m_cofunc = std::make_unique<MyCoroutine>( this, &CoroutineExample::CountTo ); |
|
||||
printf( "%s: Calling coroutine that will count from 1 to 5.\n", __FUNCTION__ ); |
|
||||
m_cofunc->Call( m_count ); |
|
||||
|
|
||||
while( m_cofunc->Running() ) |
|
||||
{ |
|
||||
printf( "%s: Got value: %d\n", __FUNCTION__, m_cofunc->ReturnValue() ); |
|
||||
m_cofunc->Resume(); |
|
||||
} |
|
||||
|
|
||||
printf( "%s: Done!\n", __FUNCTION__ ); |
|
||||
} |
|
||||
|
|
||||
std::unique_ptr<MyCoroutine> m_cofunc; |
|
||||
int m_count; |
|
||||
}; |
|
||||
|
|
||||
|
|
||||
static const wxCmdLineEntryDesc g_cmdLineDesc[] = { |
|
||||
{ |
|
||||
wxCMD_LINE_SWITCH, |
|
||||
"h", |
|
||||
"help", |
|
||||
_( "displays help on the command line parameters" ).mb_str(), |
|
||||
wxCMD_LINE_VAL_NONE, |
|
||||
wxCMD_LINE_OPTION_HELP, |
|
||||
}, |
|
||||
{ |
|
||||
wxCMD_LINE_OPTION, |
|
||||
"c", |
|
||||
"count", |
|
||||
_( "how high to count" ).mb_str(), |
|
||||
wxCMD_LINE_VAL_NUMBER, |
|
||||
wxCMD_LINE_PARAM_OPTIONAL, |
|
||||
}, |
|
||||
{ wxCMD_LINE_NONE } |
|
||||
}; |
|
||||
|
|
||||
|
|
||||
static int coroutine_main_func( int argc, char** argv ) |
|
||||
{ |
|
||||
wxCmdLineParser cl_parser( argc, argv ); |
|
||||
cl_parser.SetDesc( g_cmdLineDesc ); |
|
||||
cl_parser.AddUsageText( _( "Test a simple coroutine that yields a given number of times" ) ); |
|
||||
|
|
||||
int cmd_parsed_ok = cl_parser.Parse(); |
|
||||
if( cmd_parsed_ok != 0 ) |
|
||||
{ |
|
||||
// Help and invalid input both stop here
|
|
||||
return ( cmd_parsed_ok == -1 ) ? RET_CODES::OK : RET_CODES::BAD_CMDLINE; |
|
||||
} |
|
||||
|
|
||||
long count = 5; |
|
||||
cl_parser.Found( "count", &count ); |
|
||||
|
|
||||
CoroutineExample obj( (int) count ); |
|
||||
|
|
||||
obj.Run(); |
|
||||
|
|
||||
return RET_CODES::OK; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
/*
|
|
||||
* Define the tool interface |
|
||||
*/ |
|
||||
UTILITY_PROGRAM coroutine_tool = { |
|
||||
"coroutine", |
|
||||
"Test a simple coroutine", |
|
||||
coroutine_main_func, |
|
||||
}; |
|
||||
@ -1,77 +0,0 @@ |
|||||
/* |
|
||||
* This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
* |
|
||||
* Copyright (C) 2018 KiCad Developers, see AUTHORS.txt for contributors. |
|
||||
* |
|
||||
* This program is free software; you can redistribute it and/or |
|
||||
* modify it under the terms of the GNU General Public License |
|
||||
* as published by the Free Software Foundation; either version 2 |
|
||||
* of the License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU General Public License |
|
||||
* along with this program; if not, you may find one here: |
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|
||||
* or you may search the http://www.gnu.org website for the version 2 license, |
|
||||
* or you may write to the Free Software Foundation, Inc., |
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
*/ |
|
||||
|
|
||||
#ifndef UTILITY_PROGRAM_H |
|
||||
#define UTILITY_PROGRAM_H |
|
||||
|
|
||||
#include <functional> |
|
||||
|
|
||||
/** |
|
||||
* Return codes for tools |
|
||||
*/ |
|
||||
enum RET_CODES |
|
||||
{ |
|
||||
/// Tool exited OK |
|
||||
OK = 0, |
|
||||
|
|
||||
/// The command line was not correct for the tool |
|
||||
BAD_CMDLINE = 1, |
|
||||
|
|
||||
/// The tool asked for was not found |
|
||||
UNKNOWN_TOOL = 2, |
|
||||
|
|
||||
/// Tools can define their own statuses from here onwards |
|
||||
TOOL_SPECIFIC = 10, |
|
||||
}; |
|
||||
|
|
||||
|
|
||||
/** |
|
||||
* Description of a "utility program", which is a program that |
|
||||
* takes some command line and does "something". |
|
||||
* |
|
||||
* Likely uses of this are: |
|
||||
* |
|
||||
* * Test programs and demos |
|
||||
* * Benchmarks |
|
||||
* * Fuzz targets |
|
||||
* |
|
||||
* This structure allows a single executable to select a program from |
|
||||
* many registered programs to avoid having to maintain "N" similar CMake |
|
||||
* scripts and perform "N" linkages. |
|
||||
*/ |
|
||||
struct UTILITY_PROGRAM |
|
||||
{ |
|
||||
/// A function that provides the program for a given command line |
|
||||
using FUNC = std::function<int( int argc, char** argv )>; |
|
||||
|
|
||||
/// The name of the program (this is used to select one) |
|
||||
std::string m_name; |
|
||||
|
|
||||
/// Description of the program |
|
||||
std::string m_desc; |
|
||||
|
|
||||
/// The function to call to run the program |
|
||||
FUNC m_func; |
|
||||
}; |
|
||||
|
|
||||
#endif // UTILITY_PROGRAM_H |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue