14. LG Soft

Role

Senior Research Engineer

Profile

C++, Linux, Multi threading, Design Patterns

14.1. Round 1

Date

2024-02-14T14:00:31+0530

// design patterns
// observer & state pattern

// exposed to client code
class BaseState
{
private:
	BaseState *state;
	BaseState *next;

public:
	BaseState *nextState() { return state->next; }
}

class StartState : public BaseState
{
private:
	BaseState *next;

public:
	setNext() { next = new RunState; }
}

class RunState : public BaseState
{
private:
	BaseState *next;

public:
	setNext() { next = new StopState; }
}

class StopState : public BaseState
{
private:
	BaseState *next;

public:
	setNext() { next = NULL; }
}

int main()
{
	BaseState *state = new StartState();
	// do some task & change state
	state = state->nextState();
	// do some task & change state
	state = state->nextState();
	return 0;
}

// factory pattern
enum VehicleType {
	Car,
	Bike
}

class Vehicle
{
public:
	virtual void run(void) = 0;
}

class Car : public Vehicle
{
public:
	void run(void) { cout << "car run" << endl; }
}

class Bike : public Vehicle
{
public:
	void run(void) { cout << "car run" << endl; }
}

class VehicleFactory
{
public:
	Vehicle *createVehicle(VehicleType vt)
	{
		switch (vt) {
		}
	}
}

int main()
{
	BaseState *state = new StartState();
	// do some task & change state
	state = state->nextState();
	// do some task & change state
	state = state->nextState();
	return 0;
}

// inheritance

class Base
{
public:
	virtual void foo();
	virtual void bar(int);
};

class Derived : public Base
{
public:
	void foo() @override; // no error
	void bar() @override; // error int is not provided
};

//===

NonCopyable() = default;
NonCopyable(const NonCopyable &) = delete;
NonCopyable &operator=(const NonCopyable &) = delete;

class AssignOp
{
public:
	AssignOp operator=(const AssignOp &other)
	{
		*this = other;
		return *this;
	}
}

AssignOp a;
AssignOp b;
b = a; // assign operator is called

// lvalue, rvalue
b = func(); // func() -> a, temp object it is rvalue

std::move(object &&c);

// lamda functions: anonymous
auto eq = [](int a, int b) { return a == b };
std::compare(list1, list2, eq);
std::compare(list1, list2, [](int a, int b) { return a == b });

// threads
int thread_func(int num)
{
	for (;;) {
		cout << num++ << endl;
		sleep(2);
	}
}

int main()
{
	int num = 5;
	std::thread t1(thread_func, num);
	t1.join();
	return 0;
}

// synchronisation:
// 1. conditional variables
// 2. mutex + locks
// 3. barriers

// templates
template <typename T> T func(T a, T b)
{
	T c = a + b;
	return c;
}

template <> T func<ClassType>(ClassType a, ClassType b)
{
	T c = a + b;
	return c;
}

// write function which takes an array and returns max value of sum with two of
// its elements
// input:  [1,2,3,4,5,6]
// output: 11

int sum_2(std::vector<int> nums)
{
	int max_sum = 0;
	for (int i = 0; i < nums.size() - 1; i++) {
		int curr_sum = 0;
		for (int j = i + 1; i < nums.size(); i++) {
			curr_sum = std::max(curr_sum, nums[i] + nums[j]);
		}
		max_sum = std::max(max_sum, curr_sum);
		;
	}
	return max_sum;
}

14.2. Round 2 (30 mins)

Date

2024-02-16T17:30:31+0530

#include <iostream>

class AbstractBase
{
public:
	virtual void display() = 0; //
};

class Derived : public AbstractBase
{
public:
	void display() override;
};

int main(int ac, char **av)
{
	AbstractBase *ab = new Derived();
	return 0;
}

// Singleton pattern
class Singleton
{
public:
	static Singleton &getInstance(void)
	{
		static Singleton obj;
		return obj;
	}
}

// observer pattern
class EventNotificationsObserver
{
	std::vector<EventBase> objs;

public:
	void register_event(EventBase &obj) { objs.push_back(obj); }

	void notify_events()
	{
		for (auto o : objs) o.notify();
	}

	void receive_event(EventBase &obj) { obj.processEvent(); }
}

class EventBase
{
}

class MessageReceivedEvent : public EventBase
{
}

class MessageSentEvent : public EventBase
{
}