#include "Customer.h"
std::vector<std::string>
Customer::GetActiveCustomerNames(std::vector<Customer> customer) {
return Customer::GetActiveCustomerByFunctionField<std::string>(
customer, std::make_shared<CustomerName>());
}
std::vector<std::string>
Customer::getActiveCustomerAddresses(std::vector<Customer> customer) {
return Customer::GetActiveCustomerByFunctionField<std::string>(
customer, std::make_shared<CustomerAddress>());
}
std::vector<std::string>
Customer::GetActiveCustomerPhoneNumbers(std::vector<Customer> customer) {
return Customer::GetActiveCustomerByFunctionField<std::string>(
customer, std::make_shared<CustomerPhoneNumber>());
}
std::vector<std::string>
Customer::GetActiveCustomerEmails(std::vector<Customer> customer) {
return Customer::GetActiveCustomerByFunctionField<std::string>(
customer, std::make_shared<CustomerEmail>());
}
//재귀를 이용하여 성능향상
int Customer::CountActiveCustomers(std::vector<Customer> customer) {
if (customer.empty())
return 0;
else {
int add = customer.front().isActive ? 1 : 0;
customer.erase(customer.begin());
return add + CountActiveCustomers(customer);
}
//재귀실행
// int add = 0;
//
// for (auto cust : customer) {
// if (cust.isActive)
// ++add;
// }
// return add;
}
template <typename T>
std::vector<T> Customer::GetActiveCustomerByFunctionField(
std::vector<Customer> customers, // 등록된 객체를 매개변수로 받아 함수를
// 순수함수로 만들어 준다.
const std::shared_ptr<BaseClass<Customer, T>> &classField) {
std::vector<Customer> activeCustomers;
std::vector<T> returnList;
// 람다식을 이용하여 조건 필터링
std::copy_if(customers.begin(), customers.end(),
std::back_inserter(activeCustomers), [](Customer customer) {
if (customer.isActive) {
return true;
} else {
return false;
}
});
// for (auto &customer : customers) {
// if (customer.isActive) {
// returnList.push_back(
// classField->InvokeFunction(std::make_shared<Customer>(customer)));
// }
// }
for_each(activeCustomers.begin(), activeCustomers.end(),
[&returnList, &classField](Customer customer) {
returnList.push_back(classField->InvokeFunction(
std::make_shared<Customer>(customer)));
});
return returnList;
}
// 1급함수의 사용
// std::vector<std::string>
// Customer::GetActiveCustomerByField(const std::string &field) {
// std::function<std::string(const Customer &, Customer)> funct;
//
// if (field == "name") {
// funct = &Customer::GetActiveCustomerNames;
// } else if (field == "address") {
// funct = &Customer::getActiveCustomerAddresses;
// } else if (field == "phoneNumber") {
// funct = &Customer::GetActiveCustomerPhoneNumbers;
// } else if (field == "email") {
// funct = &Customer::GetActiveCustomerEmails;
// } else {
// throw std::invalid_argument("Unknown field");
// }
//
// return GetActiveCustomerByFunctionField(funct);
// }