Program Listing for File NuMagSANSlib_StringCompare.h#
↰ Return to documentation for file (src/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;
}
}