Skip to main content
Loading...

More C++ Posts

//Leif Messinger
//Compile with C++ 20
#include <iostream>
#include <ranges>
#include <vector>
#include <functional>
#include <cctype> //toupper
#include <cxxabi.h>

template <typename T>
void printType(){
    std::cout << abi::__cxa_demangle(typeid(T).name(), NULL, NULL, NULL) << std::endl;
}

template <typename T>
class Slicer{
    public:
        T begin_;
        T end_;
        T trueEnd;
        Slicer(T begin, T end): begin_(begin), end_(begin), trueEnd(end){}
        template<typename U>
        Slicer(U&& vec) : begin_(vec.begin()), end_(vec.begin()), trueEnd(vec.end()){}
        Slicer& finish(){
            begin_ = end_;
            end_ = trueEnd;
            return (*this);
        }
        Slicer& to(long int index){
            begin_ = end_;
            if(index > 0){
                end_ = (begin_ + index);
            }else{
                index *= -1;
                end_ = (trueEnd - index);
            }
            return (*this);
        }
        Slicer& operator[](long int index){
            return to(index);
        }
        T begin(){
            return this->begin_;
        }
        T end(){
            return this->end_;
        }
        Slicer& operator()(std::function<void(decltype(*begin_))> func) {
            for(decltype(*begin_) thing : (*this)){
                func(thing);
            }
            return (*this);
        }
};
static_assert(std::ranges::range< Slicer<std::vector<int>::const_iterator> >);

int main(){
    std::string vec = "abcdefghijklmnopqrstuvwxyz";
    Slicer<std::string::const_iterator> bruh(vec);
    
    //printType<decltype(bruh)>();

    bruh.to(3)([](char yeet){
        std::cout << yeet;
    })
    .to(-1)([](char yeet){
        std::cout << char(std::toupper(yeet));
    }).finish()([](char yeet){
        std::cout << yeet << yeet << yeet << yeet << yeet;
    });
    
    std::cout << std::endl << std::endl;
    
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    Slicer<int*> arrSlicer(arr, arr + (sizeof(arr)/sizeof(int)));
    
    std::cout << "[";
    arrSlicer.to(-1)([](int yeet){
        std::cout << yeet << ", ";
    }).finish()([](int yeet){
        std::cout << yeet << "]" << std::endl;
    });

    return 0;
}
#include <string>
#include <iostream>
#include "PlaylistNode.h"
using namespace std;

PlaylistNode::PlaylistNode() {
   uniqueID = "none";
   songName = "none";
   artistName = "none";
   songLength = 0;
   nextNodePtr = 0;
}

PlaylistNode::PlaylistNode(string uniqueID_, string songName_, string artistName_, int songLength_) {
   uniqueID = uniqueID_;
   songName = songName_;
   artistName = artistName_;
   songLength = songLength_;
   nextNodePtr = 0;
}

void PlaylistNode::InsertAfter(PlaylistNode* ptr) {
   this->SetNext(ptr->GetNext());
   ptr->SetNext(this);
}

void PlaylistNode::SetNext(PlaylistNode* ptr) {
   nextNodePtr = ptr;
}

string PlaylistNode::GetID() {
   return uniqueID;
}

string PlaylistNode::GetSongName() {
   return songName;
}

string PlaylistNode::GetArtistName() {
   return artistName;
}

int PlaylistNode::GetSongLength() {
   return songLength;
}

PlaylistNode* PlaylistNode::GetNext() {
   return nextNodePtr;
}

void PlaylistNode::PrintPlaylistNode() {
   cout << "Unique ID: " << uniqueID << endl;
   cout << "Song Name: " << songName << endl;
   cout << "Artist Name: " << artistName << endl;
   cout << "Song Length (in seconds): " << songLength << endl;
}

Playlist::Playlist() {
   head = tail = 0;
}

void Playlist::AddSong(string id, string songname, string artistname, int length) {
   PlaylistNode* n = new PlaylistNode(id, songname, artistname, length);
   if (head == 0) {
      head = tail = n;
   }
   else {
      n->InsertAfter(tail);
      tail = n;
   }
}

bool Playlist::RemoveSong(string id) {
   if (head == NULL) {
      cout << "Playlist is empty" << endl;
      return false;
   }
   
   PlaylistNode* curr = head;
   PlaylistNode* prev = NULL;
   while (curr != NULL) {
      if (curr->GetID() == id) {
         break;
      }
      prev = curr;
      curr = curr->GetNext();
   }
   
   if (curr == NULL) {
      cout << "\"" << curr->GetSongName() << "\" is not found" << endl;
      return false;
   }
   else {
      if (prev != NULL) {
         prev ->SetNext(curr->GetNext());
      }
      else {
         head = curr->GetNext();
      }
      if (tail == curr) {
         tail = prev;
      }
      cout << "\"" << curr->GetSongName() << "\" removed." << endl;
      delete curr;
      return true;
   }
}

bool Playlist::ChangePosition(int oldPos, int newPos) {
   if (head == NULL) {
      cout << "Playlist is empty" << endl;
      return false;
   }
   
   PlaylistNode* prev = NULL;
   PlaylistNode* curr = head;
   
   int pos;
   if (head == NULL || head == tail) {
      return false;
   }
   
   for (pos = 1; curr != NULL && pos < oldPos; pos++) {
      prev = curr;
      curr = curr->GetNext();
   }
   if (curr != NULL) {
      string currentSong = curr->GetSongName();
      
      if (prev == NULL) {
         head = curr->GetNext();
      }
      else {
         prev->SetNext(curr->GetNext());
      }
      if (curr == tail) {
         tail = prev;
      }
      
      PlaylistNode* curr1 = curr;
      prev = NULL;
      curr = head;
      for (pos = 1; curr != NULL && pos < newPos; pos++) {
         prev = curr;
         curr = curr->GetNext();
      }
      if (prev == NULL) {
         curr1->SetNext(head);
         head = curr1;
      }
      else {
         curr1->InsertAfter(prev);
      }
      if (curr == NULL) {
         tail = curr1;
      }
      cout << "\"" << currentSong << "\" moved to position " << newPos << endl;
      return true;
   }
   else {
      cout << "Song's current position is invalid" << endl;
      return false;
   }
}

void Playlist::SongsByArtist(string artist) {
   if (head == NULL) {
      cout << "Playlist is empty" << endl;
   }
   else {
      PlaylistNode* curr = head;
      int i = 1;
      while (curr != NULL) {
         if (curr->GetArtistName() == artist) {
            cout << endl << i << "." << endl;
            curr->PrintPlaylistNode();
         }
         curr = curr->GetNext();
         i++;
      }
   }
}

int Playlist::TotalTime() {
   int total = 0;
   PlaylistNode* curr = head;
   
   while (curr != NULL) {
      total += curr->GetSongLength();
      curr = curr->GetNext();
   }
   return total;
}

void Playlist::PrintList() {
   if (head == NULL) {
      cout << "Playlist is empty" << endl;
   }
   else {
      PlaylistNode* curr = head;
      int i = 1;
      while (curr != NULL) {
         cout << endl << i++ << "." << endl;
         curr->PrintPlaylistNode();
         curr = curr->GetNext();
      }
   }
}