From aa8dda89a3957592b5beeb65b686043846aed142 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Sat, 27 Mar 2021 18:43:14 +0100 Subject: [PATCH] Replace malloc / free by new / delete for CHAR_DESC_STRUCT Signed-off-by: Stefan Weil --- src/classify/blobclass.cpp | 7 ++-- src/classify/featdefs.cpp | 50 +++----------------------- src/classify/featdefs.h | 39 ++++++++++++-------- src/training/common/commontraining.cpp | 3 +- src/training/common/mastertrainer.cpp | 4 +-- 5 files changed, 35 insertions(+), 68 deletions(-) diff --git a/src/classify/blobclass.cpp b/src/classify/blobclass.cpp index 501d069a3..65ccbe980 100644 --- a/src/classify/blobclass.cpp +++ b/src/classify/blobclass.cpp @@ -34,13 +34,13 @@ namespace tesseract { // blob_text: Ground truth text for the blob. void Classify::LearnBlob(const std::string &fontname, TBLOB *blob, const DENORM &cn_denorm, const INT_FX_RESULT_STRUCT &fx_info, const char *blob_text) { - CHAR_DESC CharDesc = NewCharDescription(feature_defs_); + std::unique_ptr CharDesc(new CHAR_DESC_STRUCT(feature_defs_)); CharDesc->FeatureSets[0] = ExtractMicros(blob, cn_denorm); CharDesc->FeatureSets[1] = ExtractCharNormFeatures(fx_info); CharDesc->FeatureSets[2] = ExtractIntCNFeatures(*blob, fx_info); CharDesc->FeatureSets[3] = ExtractIntGeoFeatures(*blob, fx_info); - if (ValidCharDescription(feature_defs_, CharDesc)) { + if (ValidCharDescription(feature_defs_, CharDesc.get())) { // Label the features with a class name and font name. tr_file_data_ += "\n"; tr_file_data_ += fontname; @@ -49,11 +49,10 @@ void Classify::LearnBlob(const std::string &fontname, TBLOB *blob, const DENORM tr_file_data_ += "\n"; // write micro-features to file and clean up - WriteCharDescription(feature_defs_, CharDesc, tr_file_data_); + WriteCharDescription(feature_defs_, CharDesc.get(), tr_file_data_); } else { tprintf("Blob learned was invalid!\n"); } - FreeCharDescription(CharDesc); } // LearnBlob // Writes stored training data to a .tr file based on the given filename. diff --git a/src/classify/featdefs.cpp b/src/classify/featdefs.cpp index 80b082c77..cc91c8b6a 100644 --- a/src/classify/featdefs.cpp +++ b/src/classify/featdefs.cpp @@ -91,47 +91,6 @@ void InitFeatureDefs(FEATURE_DEFS_STRUCT *featuredefs) { } } -/*---------------------------------------------------------------------------*/ -/** - * Release the memory consumed by the specified character - * description and all of the features in that description. - * - * @param CharDesc character description to be deallocated - * - * Globals: - * - none - */ -void FreeCharDescription(CHAR_DESC CharDesc) { - if (CharDesc) { - for (size_t i = 0; i < CharDesc->NumFeatureSets; i++) { - FreeFeatureSet(CharDesc->FeatureSets[i]); - } - free(CharDesc); - } -} /* FreeCharDescription */ - -/*---------------------------------------------------------------------------*/ -/** - * Allocate a new character description, initialize its - * feature sets to be empty, and return it. - * - * Globals: - * - none - * - * @return New character description structure. - */ -CHAR_DESC NewCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs) { - CHAR_DESC CharDesc; - CharDesc = static_cast(malloc(sizeof(CHAR_DESC_STRUCT))); - CharDesc->NumFeatureSets = FeatureDefs.NumFeatureTypes; - - for (size_t i = 0; i < CharDesc->NumFeatureSets; i++) { - CharDesc->FeatureSets[i] = nullptr; - } - - return (CharDesc); -} /* NewCharDescription */ - /*---------------------------------------------------------------------------*/ /** * Appends a textual representation of CharDesc to str. @@ -147,7 +106,7 @@ CHAR_DESC NewCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs) { * @param str string to append CharDesc to * @param CharDesc character description to write to File */ -void WriteCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC CharDesc, std::string &str) { +void WriteCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC_STRUCT *CharDesc, std::string &str) { int NumSetsToWrite = 0; for (size_t Type = 0; Type < CharDesc->NumFeatureSets; Type++) { @@ -169,7 +128,7 @@ void WriteCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC Char // Return whether all of the fields of the given feature set // are well defined (not inf or nan). -bool ValidCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC CharDesc) { +bool ValidCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC_STRUCT *CharDesc) { bool anything_written = false; bool well_formed = true; for (size_t Type = 0; Type < CharDesc->NumFeatureSets; Type++) { @@ -210,17 +169,16 @@ bool ValidCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC Char * @param File open text file to read character description from * @return Character description read from File. */ -CHAR_DESC ReadCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, FILE *File) { +CHAR_DESC_STRUCT *ReadCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, FILE *File) { int NumSetsToRead; char ShortName[FEAT_NAME_SIZE]; - CHAR_DESC CharDesc; int Type; ASSERT_HOST(tfscanf(File, "%d", &NumSetsToRead) == 1); ASSERT_HOST(NumSetsToRead >= 0); ASSERT_HOST(NumSetsToRead <= FeatureDefs.NumFeatureTypes); - CharDesc = NewCharDescription(FeatureDefs); + auto CharDesc = new CHAR_DESC_STRUCT(FeatureDefs); for (; NumSetsToRead > 0; NumSetsToRead--) { tfscanf(File, "%s", ShortName); Type = ShortNameToFeatureType(FeatureDefs, ShortName); diff --git a/src/classify/featdefs.h b/src/classify/featdefs.h index 5f09b7b9d..7543fad9b 100644 --- a/src/classify/featdefs.h +++ b/src/classify/featdefs.h @@ -37,35 +37,46 @@ extern TESS_API const char *const kGeoFeatureType; feature consists of a number of parameters. All features within a feature set contain the same number of parameters.*/ -struct CHAR_DESC_STRUCT { - uint32_t NumFeatureSets; - FEATURE_SET FeatureSets[NUM_FEATURE_TYPES]; -}; -using CHAR_DESC = CHAR_DESC_STRUCT *; - struct FEATURE_DEFS_STRUCT { int32_t NumFeatureTypes; const FEATURE_DESC_STRUCT *FeatureDesc[NUM_FEATURE_TYPES]; }; using FEATURE_DEFS = FEATURE_DEFS_STRUCT *; +struct CHAR_DESC_STRUCT { + /// Allocate a new character description, initialize its + /// feature sets to be empty, and return it. + CHAR_DESC_STRUCT(const FEATURE_DEFS_STRUCT &FeatureDefs) { + NumFeatureSets = FeatureDefs.NumFeatureTypes; + for (size_t i = 0; i < NumFeatureSets; i++) { + FeatureSets[i] = nullptr; + } + } + + /// Release the memory consumed by the specified character + /// description and all of the features in that description. + ~CHAR_DESC_STRUCT() { + for (size_t i = 0; i < NumFeatureSets; i++) { + FreeFeatureSet(FeatureSets[i]); + } + } + + uint32_t NumFeatureSets; + FEATURE_SET FeatureSets[NUM_FEATURE_TYPES]; +}; + /*---------------------------------------------------------------------- Generic functions for manipulating character descriptions ----------------------------------------------------------------------*/ TESS_API void InitFeatureDefs(FEATURE_DEFS_STRUCT *featuredefs); -TESS_API -void FreeCharDescription(CHAR_DESC CharDesc); +bool ValidCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC_STRUCT *CharDesc); -CHAR_DESC NewCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs); - -bool ValidCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC CharDesc); - -void WriteCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC CharDesc, std::string &str); +void WriteCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, CHAR_DESC_STRUCT *CharDesc, std::string &str); TESS_API -CHAR_DESC ReadCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, FILE *File); +CHAR_DESC_STRUCT *ReadCharDescription(const FEATURE_DEFS_STRUCT &FeatureDefs, FILE *File); TESS_API uint32_t ShortNameToFeatureType(const FEATURE_DEFS_STRUCT &FeatureDefs, const char *ShortName); diff --git a/src/training/common/commontraining.cpp b/src/training/common/commontraining.cpp index 48dedff37..89a49dd22 100644 --- a/src/training/common/commontraining.cpp +++ b/src/training/common/commontraining.cpp @@ -377,7 +377,6 @@ void ReadTrainingSamples(const FEATURE_DEFS_STRUCT &feature_definitions, const c char unichar[UNICHAR_LEN + 1]; LABELEDLIST char_sample; FEATURE_SET feature_samples; - CHAR_DESC char_desc; uint32_t feature_type = ShortNameToFeatureType(feature_definitions, feature_name); // Zero out the font_sample_count for all the classes. @@ -407,7 +406,7 @@ void ReadTrainingSamples(const FEATURE_DEFS_STRUCT &feature_definitions, const c char_sample = NewLabeledList(unichar); *training_samples = push(*training_samples, char_sample); } - char_desc = ReadCharDescription(feature_definitions, file); + auto char_desc = ReadCharDescription(feature_definitions, file); feature_samples = char_desc->FeatureSets[feature_type]; if (char_sample->font_sample_count < max_samples || max_samples <= 0) { char_sample->List = push(char_sample->List, feature_samples); diff --git a/src/training/common/mastertrainer.cpp b/src/training/common/mastertrainer.cpp index 7680ab9cb..579c85745 100644 --- a/src/training/common/mastertrainer.cpp +++ b/src/training/common/mastertrainer.cpp @@ -168,7 +168,7 @@ void MasterTrainer::ReadTrainingSamples(const char *page_name, tprintf("Bad format in tr file, reading box coords\n"); continue; } - CHAR_DESC char_desc = ReadCharDescription(feature_defs, fp); + auto char_desc = ReadCharDescription(feature_defs, fp); auto *sample = new TrainingSample; sample->set_font_id(font_id); sample->set_page_num(page_number + page_images_.size()); @@ -176,7 +176,7 @@ void MasterTrainer::ReadTrainingSamples(const char *page_name, sample->ExtractCharDesc(int_feature_type, micro_feature_type, cn_feature_type, geo_feature_type, char_desc); AddSample(verification, unichar.c_str(), sample); - FreeCharDescription(char_desc); + delete char_desc; } charsetsize_ = unicharset_.size(); fclose(fp);