Program Listing for File NuMagSANSlib_StringCompare.h#

↰ Return to documentation for file (src/helper/NuMagSANSlib_StringCompare.h)

// File         : NuMagSANSlib_StringCompare.h
// Author       : Michael Philipp ADAMS, M.Sc.
// Company      : University of Luxembourg
// Department   : Department of Physics and Materials Sciences
// Group        : NanoMagnetism Group
// Group Leader : Prof. Andreas Michels
// Version      : 14 November 2024
// OS           : Linux Ubuntu
// Language     : CUDA C++

#include <iostream>
#include <fstream>
#include <sstream>
#include <sys/stat.h>
#include <sys/types.h>
#include <math.h>
#include <string>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <stdexcept>
#include <math.h>
#include <chrono>
#include <dirent.h>
#include <unistd.h>
#include <limits.h>

using namespace std;

void sort_integ(int* x, int K) {
    int buff = 0;
    for (int i = 0; i < K; i++) {
        for (int j = i + 1; j < K; j++) {
            if (x[i] > x[j]) {
                buff = x[i];
                x[i] = x[j];
                x[j] = buff;
            }
        }
    }
}

bool Check_SingleUnderscore(std::string* Names, int Number_Of_Names) {

    bool CheckFlag = true;
    int underscore_count = 0;
    string name;
    for (int k = 0; k < Number_Of_Names; k++) {
        underscore_count = 0;
        for (char ch : Names[k]) {
            if (ch == '_') {
                underscore_count++;
            }
        }
        if (underscore_count > 1) {
            CheckFlag = false;
            break;
        }
    }
    return CheckFlag;
}

bool Check_SinglePoint(std::string* Names, int Number_Of_Names) {

    bool CheckFlag = true;
    int underscore_count = 0;
    string name;
    for (int k = 0; k < Number_Of_Names; k++) {
        underscore_count = 0;
        for (char ch : Names[k]) {
            if (ch == '.') {
                underscore_count++;
            }
        }
        if (underscore_count > 1) {
            CheckFlag = false;
            break;
        }
    }
    return CheckFlag;
}

void Split_Nom_Idx(std::string* Names, int Number_Of_Names, std::string* Nom, int* Idx) {

    string name;
    for (int k = 0; k < Number_Of_Names; k++) {
        name = Names[k];

        size_t underscore_pos = name.find('_');

        if (underscore_pos != std::string::npos) {
            Nom[k] = name.substr(0, underscore_pos);
            Idx[k] = std::stoi(name.substr(underscore_pos + 1));
        } else {
            Nom[k] = name;
            Idx[k] = -1;
        }
    }
}

void Split_Nom_Idx_Type(std::string* Names, int Number_Of_Names, std::string* Nom, int* Idx, std::string* Type) {

    string name;
    for (int k = 0; k < Number_Of_Names; k++) {
        name = Names[k];

        size_t underscore_pos = name.find('_');
        size_t point_pos = name.find('.');

        if (underscore_pos != std::string::npos) {
            Nom[k] = name.substr(0, underscore_pos);
            Idx[k] = std::stoi(name.substr(underscore_pos + 1, point_pos - underscore_pos - 1));
            Type[k] = name.substr(point_pos + 1);
        } else {
            Nom[k] = name;
            Idx[k] = -1;
            Type[k] = "";
        }
    }
}

bool Check_Nom_Consistency(std::string* Nom, int Number_Of_Names) {

    std::string ReferenceNom = Nom[0];
    for (int i = 0; i < Number_Of_Names; i++) {
        if (Nom[i] != ReferenceNom) {
            return false;
        }
    }
    return true;
}

bool Check_Idx_Consistency(int* Idx, int Number_Of_Names) {

    for (int k = 0; k < Number_Of_Names; k++) {
        if (Idx[k] != k + 1) {
            return false;
        }
    }
    return true;
}

void CheckStrings_FolderNames(std::string* Names, int Number_Of_Names, bool* CheckFlag, std::string* Nom) {

    bool UnderscoreCheckFlag = Check_SingleUnderscore(Names, Number_Of_Names);

    if (UnderscoreCheckFlag) {
        string Nom_array[Number_Of_Names];
        int Idx_array[Number_Of_Names];
        Split_Nom_Idx(Names, Number_Of_Names, Nom_array, Idx_array);
        sort_integ(Idx_array, Number_Of_Names);

        bool NomConsistencyFlag = Check_Nom_Consistency(Nom_array, Number_Of_Names);
        bool IdxConsistencyFlag = Check_Idx_Consistency(Idx_array, Number_Of_Names);
        if (NomConsistencyFlag && IdxConsistencyFlag) {
            *Nom = Nom_array[0];
            *CheckFlag = true;
        } else {
            *Nom = "";
            *CheckFlag = false;
        }
    } else {
        *Nom = "";
        *CheckFlag = false;
    }
}

void CheckStrings_ElementNames(std::string* Names, int Number_Of_Names, bool* CheckFlag, std::string* Nom,
                               std::string* Type) {

    bool UnderscoreCheckFlag = Check_SingleUnderscore(Names, Number_Of_Names);
    bool PointCheckFlag = Check_SinglePoint(Names, Number_Of_Names);

    if (UnderscoreCheckFlag && PointCheckFlag) {
        std::string Nom_array[Number_Of_Names];
        int Idx_array[Number_Of_Names];
        std::string Type_array[Number_Of_Names];
        Split_Nom_Idx_Type(Names, Number_Of_Names, Nom_array, Idx_array, Type_array);
        sort_integ(Idx_array, Number_Of_Names);

        bool NomConsistencyFlag = Check_Nom_Consistency(Nom_array, Number_Of_Names);
        bool IdxConsistencyFlag = Check_Idx_Consistency(Idx_array, Number_Of_Names);
        bool TypeConsistencyFlag = Check_Nom_Consistency(Type_array, Number_Of_Names);

        if (NomConsistencyFlag && IdxConsistencyFlag && TypeConsistencyFlag) {
            *Nom = Nom_array[0];
            *Type = Type_array[0];
            *CheckFlag = true;
        } else {
            *Nom = "";
            *Type = "";
            *CheckFlag = false;
        }
    } else {
        *Nom = "";
        *Type = "";
        *CheckFlag = false;
    }
}