# Makefile
# CSE 333 Lecture 15 code

CXX = g++
CPPFLAGS = -Wall -g -std=c++17
PROGS = toyuse shareduse sharedvec sharedrefcount uniquepass uniquevec uniquemove uniquearray sharedcycle weakcycle weakrefcount uniquevecsort uniquemap

# default target builds all executables
all: $(PROGS)

# ToyPtr example
toyuse: toyuse.cc ToyPtr.h
	$(CXX) $(CPPFLAGS) -o $@ $<

# shared_ptr usage example
shareduse: shareduse.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# shared_ptr in vector container example
sharedvec: sharedvec.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# shared_ptr reference counting example
sharedrefcount: sharedrefcount.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr passing ownership examples
uniquepass: uniquepass.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr in vector container example
uniquevec: uniquevec.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr and move semantics examples
uniquemove: uniquemove.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr and array pointer example
uniquearray: uniquearray.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# shared_ptr in a reference counting cycle
sharedcycle: sharedcycle.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# weak_ptr in a reference counting cycle
weakcycle: weakcycle.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# weak_ptr dangling reference example
weakrefcount: weakrefcount.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr and vector sorting example (Bonus slides)
uniquevecsort: uniquevecsort.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# unique_ptr and map example
uniquemap: uniquemap.cc
	$(CXX) $(CPPFLAGS) -o $@ $<

# phony target - remove generated files and backups
clean:
	rm -f *.o $(PROGS) *~