Skip to main content

Posts

Bind lambda with a class and execute while class instance destroys (A final pattern)

 Let's have a template class like below: template< typename T > class finalGuard {     T m_func; public:     finalGuard(T func) : m_func(func) {}     ~finalGuard() { m_func(); } }; What is the requirement? I need to execute lambda when a template instance of the above class goes out of scope or any exception is caused during the execution of code. We can think of this as more or like a final pattern. When a class object's lifetime ends, a piece of code will start executing to wrap up things.  Now I have a factory-like function defined as below to resolve type dependency which lambda is expecting: template< typename T > finalGuard< T > finalCall(T obj) { return obj; }  The below piece of code is used to bind the lambda with the class instance and it gets executed as soon as a class object destructor gets invoked. int main() {     try {         auto guard = finalCall([]() noexcept {     ...

C++ property and detection of property change event

In C++, property means a private field with a getter and a setter method. Unlike C# and other languages, it is part of the language where it is set or accessed just like a field. In C++ never had the notion of the way C# address gets or set of property field(s). However, in MSVC, Clang a property extension has been added to give a notion of get / set of property. How it looks like? Let's have a small code:  #include <iostream> #include <string> using std::cout; using std::string; class Animal {     string sName_; public:     string getName() const { return sName_; }     void setName(const string &asName)     {         sName_ = asName;     } public:     __declspec(property(get = getName, put = setName)) string sName; }; int main() {     Animal aObj;     // Set animal name     aObj.sName = "Cat";     cout << "The animal is: " << aObj.sNam...

Find time from time ranges (including overlapping ranges)

 This is a very simple problem. In this trying to find a given time from ranges of times. So, I have a collection which stores different time ranges (including overlapping time ranges). The job is to find or search if a time provided by user exists in time ranges collection. Example: Let's assume I have following collections of time ranges: 1. 07:00 - 09:00  2. 13:45 - 15:15 3. 16:25 - 18:10 4. 08:30 - 10:00 Now, need to find if time 09:30 is present in that collection or not. If it finds it shall print true, otherwise false. Similarly it can be use to check other times too. Solution: To store time ranges, what I did is converted start and end time to decimal numbers respectively and stored them in STL's set (multiset) used to address overlapping ranges. As we know that set data structure in STL is a tree (Red Black Tree / Balanced Binary tree).  Time Complexity:  1. set::insert - If N elements are inserted, Nlog(size+N). Implementations may optimize if the range is ...

Network Shell Utility (netsh, An useful usage)

 In Windows OS, there is a command known as netsh or network shell. It is a command line utility included in Microsoft Windows NT lines of the operating system, beginning with Windows 2000. It allows local/remote network configuration as well as it can be used to display network configuration. Today, we can see how 'netsh' can be leveraged to display wireless passwords. It happens we may forget the wireless password(s) after connecting a device to many wireless networks since it gets stored as a part of the network profile. That said, we enter password for a wireless network for the first time and it gets stored, and then the next time onwards the device gets connected to the wireless network once it is available. We don't need to key in a password again. As a result, we may forget passwords and may get challenged to remember and connect to any other device.  In this post, we will see how can we leverage netsh command to get/retrieve wireless network passwords from a device...

Conversion to std::string and return from function

 Many times I have come across code something like the below: class AClass { public:     std::string getName(); }; std::string AClass::getName() {     return "I am returning"; } Here the member function converts the string constant to std::string while returning. This is in my opinion not necessary. This cast away some flexibility. I mean this way of converting to a std::string while returning to function does not make much sense.  Reason:  If we need in any place to get the name as const char* I need to reverse by calling string::c_str() const char* pName = instanceOfClassA.getName().c_str(); However, keeping the return type as const char* has some benefits: const char* AClass::getName() const {     return "I am returning"; } 1. const char* pName =  instanceOfClassA.getName().getName(); // No Conversion will take place 2. std::string sName = instanceOfClassA.getName().getName(); // Conversion happens to std::string  So, only based ...

A simple echo program

The following small program accepts streams from the console and prints out as soon as we hit enter. #include template < typename In, typename Out > void Echo(In& in, Out& out) {     out << in.rdbuf(); } int main() {     Echo(std::cin, std::cout);     return 0; } So, the rdbuf() returns a pointer to the underlying  basic_streambuf  for the input stream and prints it out again on the console. The program runs in a loop until we break it by Ctrl+C.

Pancake Sorting using C++(STL)

This is a variation of selection sort, it bring the largest pancake not yet sorted to the top with one flip; take it down to its final position with one more flip; and repeat this process for the remaining pancakes. The algorithm has been discussed in following wiki link: Pancake Sorting The algorithm is visually represented in following link: Pancake Sorting(Visualization) The idea of this sorting is similar to Selection Sort, here taking maximum items one by one and started placing those from last and at the same time reducing the vector size one by one. To place bigger items in order from last using flips two move to their respective positions. Here is the implementation using std::rotate() and std::reverse(). The output: