Files
@ r24498:e9114d9ab04a
Branch filter:
Location: cpp/openttd-patchpack/source/src/stringfilter_type.h - annotation
r24498:e9114d9ab04a
3.0 KiB
text/x-c
Fix #6468: don't store version of AIs-started-via-console in name
You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.
However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.
By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
You can do: "startai myai.3", which starts version 3 of "myai".
This is very useful for testing save/load code between different
versions of your AI.
However, when using this syntax, the AI got saved as "myai.3" as
name of the AI, instead of "myai". This caused several problems,
like indicating to the user the AI could not be found, but still
load the AI. But in all cases, the AI never got the chance to
load the saved data, making the whole reason this exists pointless.
By splitting the name and version already in the console command,
the code becomes simpler and AIs started this way now follow the
normal flow after initialization.
r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19689:2a52dbf2e570 r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r23539:bce8329ee42d r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r23607:36c15679007d r19420:97b6814a3b2f r23607:36c15679007d r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r23520:20bbc807b0eb r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19689:2a52dbf2e570 r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f r23520:20bbc807b0eb r19420:97b6814a3b2f r19420:97b6814a3b2f r19420:97b6814a3b2f | /*
* This file is part of OpenTTD.
* OpenTTD 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, version 2.
* OpenTTD 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 OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file stringfilter_type.h Searching and filtering using a stringterm. */
#ifndef STRINGFILTER_TYPE_H
#define STRINGFILTER_TYPE_H
#include "core/smallvec_type.hpp"
#include "strings_type.h"
/**
* String filter and state.
*
* The filter takes a stringterm and parses it into words separated by whitespace.
* The whitespace-separation can be avoided by quoting words in the searchterm using " or '.
* The quotation characters can be nested or concatenated in a unix-shell style.
*
* When filtering an item, all words are checked for matches, and the filter matches if every word
* matched. So, effectively this is a AND search for all entered words.
*
* Once the filter is set up using SetFilterTerm, multiple items can be filtered consecutively.
* 1. For every item first call ResetState() which resets the matching-state.
* 2. Pass all lines of the item via AddLine() to the filter.
* 3. Check the matching-result for the item via GetState().
*/
struct StringFilter {
private:
/** State of a single filter word */
struct WordState {
const char *start; ///< Word to filter for.
bool match; ///< Already matched?
};
const char *filter_buffer; ///< Parsed filter string. Words separated by 0.
std::vector<WordState> word_index; ///< Word index and filter state.
uint word_matches; ///< Summary of filter state: Number of words matched.
const bool *case_sensitive; ///< Match case-sensitively (usually a static variable).
public:
/**
* Constructor for filter.
* @param case_sensitive Pointer to a (usually static) variable controlling the case-sensitivity. nullptr means always case-insensitive.
*/
StringFilter(const bool *case_sensitive = nullptr) : filter_buffer(nullptr), word_matches(0), case_sensitive(case_sensitive) {}
~StringFilter() { free(this->filter_buffer); }
void SetFilterTerm(const char *str);
/**
* Check whether any filter words were entered.
* @return true if no words were entered.
*/
bool IsEmpty() const { return this->word_index.size() == 0; }
void ResetState();
void AddLine(const char *str);
void AddLine(StringID str);
/**
* Get the matching state of the current item.
* @return true if matched.
*/
bool GetState() const { return this->word_matches == this->word_index.size(); }
};
#endif /* STRINGFILTER_TYPE_H */
|